use std::rc::Rc;
use std::cell::RefCell;
#[derive(Debug, Clone)]
pub struct TreeNode {
pub val: i32,
pub left: Option<Rc<RefCell<TreeNode>>>,
pub right: Option<Rc<RefCell<TreeNode>>>,
}
impl TreeNode {
pub fn new(val: i32) -> Rc<RefCell<TreeNode>> {
Rc::new(RefCell::new(TreeNode { val, left: None, right: None }))
}
}
fn inorder_predecessor(root: Option<Rc<RefCell<TreeNode>>>, key: i32) -> Option<i32> {
let mut predecessor = None;
let mut curr = root.clone();
// Find the node with value == key
while let Some(node_rc) = curr.clone() {
let node = node_rc.borrow();
if key <= node.val {
curr = node.left.clone(); // move left if key smaller or equal
} else {
predecessor = Some(node.val); // update predecessor
curr = node.right.clone(); // move right to find closer smaller
}
}
// If predecessor found, return it
predecessor
}
fn main() {
// Build BST manually
let root = TreeNode::new(5);
let node3 = TreeNode::new(3);
let node7 = TreeNode::new(7);
let node2 = TreeNode::new(2);
let node4 = TreeNode::new(4);
let node8 = TreeNode::new(8);
root.borrow_mut().left = Some(node3.clone());
root.borrow_mut().right = Some(node7.clone());
node3.borrow_mut().left = Some(node2.clone());
node3.borrow_mut().right = Some(node4.clone());
node7.borrow_mut().right = Some(node8.clone());
let key = 5;
let pred = inorder_predecessor(Some(root.clone()), key);
match pred {
Some(val) => println!("Inorder predecessor of {} is {}", key, val),
None => println!("No inorder predecessor found for {}", key),
}
}while let Some(node_rc) = curr.clone() {
Traverse the tree to find the predecessor candidate
if key <= node.val { curr = node.left.clone(); } else { predecessor = Some(node.val); curr = node.right.clone(); }
If current node value is smaller than key, update predecessor and go right; else go left
Inorder predecessor of 5 is 4