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 preorder_traversal(root: Option<Rc<RefCell<TreeNode>>>, result: &mut Vec<i32>) {
if let Some(node_rc) = root {
let node = node_rc.borrow();
result.push(node.val); // visit root first
preorder_traversal(node.left.clone(), result); // traverse left subtree
preorder_traversal(node.right.clone(), result); // traverse right subtree
}
}
fn main() {
// Build tree:
// 1
// / \
// 2 3
// / \
// 4 5
let root = TreeNode::new(1);
let node2 = TreeNode::new(2);
let node3 = TreeNode::new(3);
let node4 = TreeNode::new(4);
let node5 = TreeNode::new(5);
root.borrow_mut().left = Some(node2.clone());
root.borrow_mut().right = Some(node3.clone());
node2.borrow_mut().left = Some(node4);
node2.borrow_mut().right = Some(node5);
let mut result = Vec::new();
preorder_traversal(Some(root), &mut result);
for (i, val) in result.iter().enumerate() {
if i > 0 {
print!(" -> ");
}
print!("{}", val);
}
print!("\n");
}
result.push(node.val); // visit root first
visit current node before children
preorder_traversal(node.left.clone(), result); // traverse left subtree
recursively traverse left subtree
preorder_traversal(node.right.clone(), result); // traverse right subtree
recursively traverse right subtree