Cover image for Interview Classic 150 Questions P129 Sum Root to Leaf Numbers

Interview Classic 150 Questions P129 Sum Root to Leaf Numbers


Timeline

Timeline

2025-10-28

init

Depth-first traversal

Problem:

Depth-first traversal; preorder, inorder, or postorder traversal of the tree all work. Here we choose preorder traversal.

Preorder traversal ⊂ depth-first traversal
✘ But DFS ≠ only preorder traversalit also has two other forms: inorder and postorder.

More specifically:

Traversal methodBelongs to DFS?Order description (for binary tree)
Preorder traversal (Preorder)Yes, DFSRoot → Left → Right
Inorder traversal (Inorder)Yes, DFSLeft → Root → Right
Postorder traversal (Postorder)Yes, DFSLeft → Right → Root
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
// Definition for a binary tree node.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 {        // Depth-first traversal        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    }}

Depth-First Search

1234567891011121314151617
class Solution {public:    int dfs(TreeNode* root, int prevSum) {        if (root == nullptr) return 0;                int sum = prevSum * 10 + root->val;                if (root->left == nullptr && root->right == nullptr)            return sum;        else            return dfs(root->left, sum) + dfs(root->right, sum);            }        int sumNumbers(TreeNode* root) {        return dfs(root, 0);    }};
Loading comments…