1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
#![allow(dead_code)] use std::cell::RefCell; use std::rc::Rc; use crate::binary_tree::TreeNode; pub fn preorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> { let mut res = vec![]; preorder(root, &mut res); res } fn preorder(root: Option<Rc<RefCell<TreeNode>>>, mut res: &mut Vec<i32>) { match root { None => {} Some(node) => { res.push(node.borrow().val); preorder(node.borrow().left.clone(), &mut res); preorder(node.borrow().right.clone(), &mut res); } } } #[cfg(test)] mod tests { use super::*; #[test] fn test1() { let tree = Some(Rc::new(RefCell::new(TreeNode { val: 1, left: None, right: Some(Rc::new(RefCell::new(TreeNode { val: 2, left: Some(Rc::new(RefCell::new(TreeNode { val: 3, left: None, right: None, }))), right: None, }))), }))); let res = preorder_traversal(tree); assert_eq!(res, vec![1, 2, 3]); } }