Consider the following Rust code that builds a BST and deletes a leaf node. What is the printed BST in-order traversal after deletion?
use std::rc::Rc; use std::cell::RefCell; #[derive(Debug)] struct TreeNode { val: i32, left: Option<Rc<RefCell<TreeNode>>>, right: Option<Rc<RefCell<TreeNode>>>, } impl TreeNode { fn new(val: i32) -> Rc<RefCell<TreeNode>> { Rc::new(RefCell::new(TreeNode { val, left: None, right: None })) } } fn insert(root: &mut Option<Rc<RefCell<TreeNode>>>, val: i32) { match root { None => *root = Some(TreeNode::new(val)), Some(node) => { if val < node.borrow().val { insert(&mut node.borrow_mut().left, val); } else { insert(&mut node.borrow_mut().right, val); } } } } fn inorder(root: &Option<Rc<RefCell<TreeNode>>>, vals: &mut Vec<i32>) { if let Some(node) = root { inorder(&node.borrow().left, vals); vals.push(node.borrow().val); inorder(&node.borrow().right, vals); } } fn find_min(node: Rc<RefCell<TreeNode>>) -> Rc<RefCell<TreeNode>> { let mut current = node; while let Some(left) = current.borrow().left.clone() { current = left; } current } fn delete_node(root: &mut Option<Rc<RefCell<TreeNode>>>, key: i32) { if let Some(node) = root { if key < node.borrow().val { delete_node(&mut node.borrow_mut().left, key); } else if key > node.borrow().val { delete_node(&mut node.borrow_mut().right, key); } else { if node.borrow().left.is_none() { *root = node.borrow().right.clone(); } else if node.borrow().right.is_none() { *root = node.borrow().left.clone(); } else { let min_node = find_min(node.borrow().right.clone().unwrap()); node.borrow_mut().val = min_node.borrow().val; delete_node(&mut node.borrow_mut().right, min_node.borrow().val); } } } } fn main() { let mut root = None; insert(&mut root, 5); insert(&mut root, 3); insert(&mut root, 7); insert(&mut root, 2); insert(&mut root, 4); insert(&mut root, 6); insert(&mut root, 8); delete_node(&mut root, 2); let mut vals = Vec::new(); inorder(&root, &mut vals); println!("{:?}", vals); }
Deleting a leaf node removes it from the tree. The in-order traversal prints nodes in sorted order.
Node 2 is a leaf and is removed. The in-order traversal then prints all remaining nodes in ascending order.
What is the in-order traversal output after deleting node 7 (which has one child) from the BST?
use std::rc::Rc; use std::cell::RefCell; #[derive(Debug)] struct TreeNode { val: i32, left: Option<Rc<RefCell<TreeNode>>>, right: Option<Rc<RefCell<TreeNode>>>, } impl TreeNode { fn new(val: i32) -> Rc<RefCell<TreeNode>> { Rc::new(RefCell::new(TreeNode { val, left: None, right: None })) } } fn insert(root: &mut Option<Rc<RefCell<TreeNode>>>, val: i32) { match root { None => *root = Some(TreeNode::new(val)), Some(node) => { if val < node.borrow().val { insert(&mut node.borrow_mut().left, val); } else { insert(&mut node.borrow_mut().right, val); } } } } fn inorder(root: &Option<Rc<RefCell<TreeNode>>>, vals: &mut Vec<i32>) { if let Some(node) = root { inorder(&node.borrow().left, vals); vals.push(node.borrow().val); inorder(&node.borrow().right, vals); } } fn find_min(node: Rc<RefCell<TreeNode>>) -> Rc<RefCell<TreeNode>> { let mut current = node; while let Some(left) = current.borrow().left.clone() { current = left; } current } fn delete_node(root: &mut Option<Rc<RefCell<TreeNode>>>, key: i32) { if let Some(node) = root { if key < node.borrow().val { delete_node(&mut node.borrow_mut().left, key); } else if key > node.borrow().val { delete_node(&mut node.borrow_mut().right, key); } else { if node.borrow().left.is_none() { *root = node.borrow().right.clone(); } else if node.borrow().right.is_none() { *root = node.borrow().left.clone(); } else { let min_node = find_min(node.borrow().right.clone().unwrap()); node.borrow_mut().val = min_node.borrow().val; delete_node(&mut node.borrow_mut().right, min_node.borrow().val); } } } } fn main() { let mut root = None; insert(&mut root, 5); insert(&mut root, 3); insert(&mut root, 7); insert(&mut root, 6); insert(&mut root, 8); delete_node(&mut root, 7); let mut vals = Vec::new(); inorder(&root, &mut vals); println!("{:?}", vals); }
Deleting a node with one child replaces it with its child.
Node 7 has one child (6). After deletion, 7 is replaced by 6. The in-order traversal reflects this.
What is the in-order traversal output after deleting node 5 (which has two children) from the BST?
use std::rc::Rc; use std::cell::RefCell; #[derive(Debug)] struct TreeNode { val: i32, left: Option<Rc<RefCell<TreeNode>>>, right: Option<Rc<RefCell<TreeNode>>>, } impl TreeNode { fn new(val: i32) -> Rc<RefCell<TreeNode>> { Rc::new(RefCell::new(TreeNode { val, left: None, right: None })) } } fn insert(root: &mut Option<Rc<RefCell<TreeNode>>>, val: i32) { match root { None => *root = Some(TreeNode::new(val)), Some(node) => { if val < node.borrow().val { insert(&mut node.borrow_mut().left, val); } else { insert(&mut node.borrow_mut().right, val); } } } } fn inorder(root: &Option<Rc<RefCell<TreeNode>>>, vals: &mut Vec<i32>) { if let Some(node) = root { inorder(&node.borrow().left, vals); vals.push(node.borrow().val); inorder(&node.borrow().right, vals); } } fn find_min(node: Rc<RefCell<TreeNode>>) -> Rc<RefCell<TreeNode>> { let mut current = node; while let Some(left) = current.borrow().left.clone() { current = left; } current } fn delete_node(root: &mut Option<Rc<RefCell<TreeNode>>>, key: i32) { if let Some(node) = root { if key < node.borrow().val { delete_node(&mut node.borrow_mut().left, key); } else if key > node.borrow().val { delete_node(&mut node.borrow_mut().right, key); } else { if node.borrow().left.is_none() { *root = node.borrow().right.clone(); } else if node.borrow().right.is_none() { *root = node.borrow().left.clone(); } else { let min_node = find_min(node.borrow().right.clone().unwrap()); node.borrow_mut().val = min_node.borrow().val; delete_node(&mut node.borrow_mut().right, min_node.borrow().val); } } } } fn main() { let mut root = None; insert(&mut root, 5); insert(&mut root, 3); insert(&mut root, 7); insert(&mut root, 2); insert(&mut root, 4); insert(&mut root, 6); insert(&mut root, 8); delete_node(&mut root, 5); let mut vals = Vec::new(); inorder(&root, &mut vals); println!("{:?}", vals); }
Deleting a node with two children replaces it with its in-order successor (smallest node in right subtree).
Node 5 is replaced by node 6 (in-order successor). Node 6 is then deleted from its original position.
What error will this Rust code produce when deleting a node from the BST?
fn delete_node(root: &mut Option<Rc<RefCell<TreeNode>>>, key: i32) {
if let Some(node) = root {
if key < node.borrow().val {
delete_node(&mut node.borrow_mut().left, key);
} else if key > node.borrow().val {
delete_node(&mut node.borrow_mut().right, key);
} else {
if node.borrow().left.is_none() {
*root = node.borrow().right.clone();
} else if node.borrow().right.is_none() {
*root = node.borrow().left.clone();
} else {
let min_node = find_min(node.borrow().right.clone().unwrap());
node.borrow_mut().val = min_node.borrow().val;
delete_node(&mut node.borrow_mut().right, min_node.borrow().val);
}
}
}
}
// Assume TreeNode and find_min are defined as before.Look at how mutable borrows are used inside the recursive calls.
The code tries to borrow node mutably multiple times simultaneously, causing a runtime panic in Rust due to borrow rules.
Given a BST with 7 nodes, if the root node has two children and is deleted using the standard BST delete operation, what is the minimum number of nodes remaining in the BST?
Deleting a node with two children replaces it with its in-order successor, which is then deleted from its original position.
The in-order successor replaces the deleted node, so the total number of nodes decreases by one.
