Consider the following Rust code that inserts a value into a Binary Search Tree (BST). What will be the printed BST in-order traversal after inserting the value 7?
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: Option<Rc<RefCell<TreeNode>>>, val: i32) -> Option<Rc<RefCell<TreeNode>>> { match root { None => Some(TreeNode::new(val)), Some(node) => { if val < node.borrow().val { let left = insert(node.borrow().left.clone(), val); node.borrow_mut().left = left; } else { let right = insert(node.borrow().right.clone(), val); node.borrow_mut().right = right; } Some(node) } } } 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 main() { let mut root = Some(TreeNode::new(5)); root = insert(root, 3); root = insert(root, 8); root = insert(root, 6); root = insert(root, 10); root = insert(root, 2); root = insert(root, 4); root = insert(root, 7); let mut vals = Vec::new(); inorder(&root, &mut vals); println!("{:?}", vals); }
Remember that in-order traversal of a BST prints values in sorted order.
Inserting 7 places it as the right child of 6 and left child of 8. The in-order traversal visits nodes in ascending order: 2, 3, 4, 5, 6, 7, 8, 10.
Given the BST and insert function below, what is the in-order traversal output after inserting 1?
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: Option<Rc<RefCell<TreeNode>>>, val: i32) -> Option<Rc<RefCell<TreeNode>>> { match root { None => Some(TreeNode::new(val)), Some(node) => { if val < node.borrow().val { let left = insert(node.borrow().left.clone(), val); node.borrow_mut().left = left; } else { let right = insert(node.borrow().right.clone(), val); node.borrow_mut().right = right; } Some(node) } } } 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 main() { let mut root = Some(TreeNode::new(5)); root = insert(root, 3); root = insert(root, 8); root = insert(root, 6); root = insert(root, 10); root = insert(root, 2); root = insert(root, 4); root = insert(root, 1); let mut vals = Vec::new(); inorder(&root, &mut vals); println!("{:?}", vals); }
In-order traversal prints nodes in ascending order for BST.
Inserting 1 places it as the left child of 2. The in-order traversal visits nodes in ascending order: 1, 2, 3, 4, 5, 6, 8, 10.
Examine the Rust code below for inserting into a BST. It compiles but causes a runtime error when inserting duplicate values. What is the cause?
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: Option<Rc<RefCell<TreeNode>>>, val: i32) -> Option<Rc<RefCell<TreeNode>>> { match root { None => Some(TreeNode::new(val)), Some(node) => { if val <= node.borrow().val { let left = insert(node.borrow().left.clone(), val); node.borrow_mut().left = left; } else { let right = insert(node.borrow().right.clone(), val); node.borrow_mut().right = right; } Some(node) } } } fn main() { let mut root = Some(TreeNode::new(5)); root = insert(root, 3); root = insert(root, 8); root = insert(root, 3); // duplicate }
Think about what happens when the inserted value equals a node's value.
Using <= causes duplicates to always go left, leading to infinite recursion when the same value is inserted repeatedly.
After inserting a new value into a Binary Search Tree (BST), which property must always be true?
Recall the definition of a BST.
The BST property requires left subtree nodes to be less and right subtree nodes to be greater than the current node's value. Uniqueness and balance are not guaranteed by BST insertion alone.
Given the Rust BST insert code below, what is the in-order traversal output after inserting the values in this order: 15, 10, 20, 8, 12, 17, 25, 19?
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: Option<Rc<RefCell<TreeNode>>>, val: i32) -> Option<Rc<RefCell<TreeNode>>> { match root { None => Some(TreeNode::new(val)), Some(node) => { if val < node.borrow().val { let left = insert(node.borrow().left.clone(), val); node.borrow_mut().left = left; } else { let right = insert(node.borrow().right.clone(), val); node.borrow_mut().right = right; } Some(node) } } } 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 main() { let mut root = None; let values = [15, 10, 20, 8, 12, 17, 25, 19]; for &v in &values { root = insert(root, v); } let mut vals = Vec::new(); inorder(&root, &mut vals); println!("{:?}", vals); }
In-order traversal of BST prints values in ascending order.
The inserted values form a BST where in-order traversal visits nodes in sorted order: 8, 10, 12, 15, 17, 19, 20, 25.
