Hello there! I'm trying to create a binary search tree from a C implementation. The problem is I can't pass the borrow checker
void BST::createFromPreorder(int *pre, int n) {
// Create root node
int i = 0;
root = new Node;
root->data = pre[i++];
root->lchild = nullptr;
root->rchild = nullptr;
// Iterative steps
Node* t;
Node* p = root;
stack<Node*> stk;
while (i < n){
// Left child case
if (pre[i] < p->data){
t = new Node;
t->data = pre[i++];
t->lchild = nullptr;
t->rchild = nullptr;
p->lchild = t;
stk.push(p);
p = t;
} else {
// Right child cases
if (pre[i] > p->data && pre[i] < stk.empty() ? 32767 : stk.top()->data){
t = new Node;
t->data = pre[i++];
t->lchild = nullptr;
t->rchild = nullptr;
p->rchild = t;
p = t;
} else {
p = stk.top();
stk.pop();
}
}
}
}
My failed attempt:
fn create_preorder(&mut self, items: &[T]) {
let mut i = 0;
let n = items.len();
if n == 0 {
return;
}
self.root = Some(Box::new(Node::new(items[i])));
i = i + 1;
let mut stack = VecDeque::new();
let mut pointer = self.root;
while i < n {
let current = items[i];
if let Some(ref mut node) = pointer {
if current < node.value {
let t = Box::new(Node::new(current));
node.left = Some(t);
stack.push_back(node);
pointer = node.left;
i = i + 1;
} else {
if let Some(ref mut parent) = stack.pop_back() {
if current > node.value && current < parent.value {
let t = Box::new(Node::new(current));
node.right = Some(t);
pointer = Some(t);
i = i + 1;
stack.push_back(parent);
} else {
pointer = Some(parent);
}
} else if current > node.value {
let t = Box::new(Node::new(current));
node.right = Some(t);
pointer = t;
i = i + 1;
}
}
}
}
}
Am I struggling because I'm trying to implement a 1:1 copy from a different language? How it would look like from a Rust perspective?
Thank you!