题目:
深度优先遍历,用树的先序遍历,中序遍历,后序遍历均可。这里选择先序遍历。
✔ 先序遍历 ⊂ 深度优先遍历
✘ 但 DFS ≠ 只有先序遍历,它还有另外两种形式:中序和后序。
更具体地说:
| 遍历方式 |
属于 DFS 吗 |
顺序描述(对二叉树) |
| 前序遍历 (Preorder) |
是 DFS |
根 → 左 → 右 |
| 中序遍历 (Inorder) |
是 DFS |
左 → 根 → 右 |
| 后序遍历 (Postorder) |
是 DFS |
左 → 右 → 根 |
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 48 49 50 51
| struct Solution; #[derive(Debug, PartialEq, Eq)] pub struct TreeNode { pub val: i32, pub left: Option<Rc<RefCell<TreeNode>>>, pub right: Option<Rc<RefCell<TreeNode>>>, }
impl TreeNode { #[inline] pub fn new(val: i32) -> Self { TreeNode { val, left: None, right: None, } } } use std::cell::RefCell; use std::collections::VecDeque; use std::rc::Rc; impl Solution { pub fn sum_numbers(root: Option<Rc<RefCell<TreeNode>>>) -> i32 { let mut stack = VecDeque::new(); let mut sum = 0; if let Some(node) = root { let val = node.borrow().val; stack.push_back((node, val)); } else { return 0; } while let Some((node, val)) = stack.pop_back() { let node_ref = node.borrow(); if node_ref.left.is_none() && node_ref.right.is_none() { sum += val; } if let Some(right) = node_ref.right.clone() { let right_val = right.borrow().val; stack.push_back((right, val * 10 + right_val)); }
if let Some(left) = node_ref.left.clone() { let left_val = left.borrow().val; stack.push_back((left, val * 10 + left_val)); } } sum } }
|