/* * File: preorder_traversal_ii_compact.rs * Created Time: 2023-07-15 * Author: codingonion (coderonion@gmail.com) */ use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; use std::{cell::RefCell, rc::Rc}; /* 前序遍历:例题二 */ fn pre_order( res: &mut Vec>>>, path: &mut Vec>>, root: Option<&Rc>>, ) { if root.is_none() { return; } if let Some(node) = root { // 尝试 path.push(node.clone()); if node.borrow().val == 7 { // 记录解 res.push(path.clone()); } pre_order(res, path, node.borrow().left.as_ref()); pre_order(res, path, node.borrow().right.as_ref()); // 回退 path.pop(); } } /* Driver Code */ pub fn main() { let root = vec_to_tree([1, 7, 3, 4, 5, 6, 7].map(|x| Some(x)).to_vec()); println!("初始化二叉树"); print_util::print_tree(root.as_ref().unwrap()); // 前序遍历 let mut path = Vec::new(); let mut res = Vec::new(); pre_order(&mut res, &mut path, root.as_ref()); println!("\n输出所有根节点到节点 7 的路径"); for path in res { let mut vals = Vec::new(); for node in path { vals.push(node.borrow().val) } println!("{:?}", vals); } }