Nameless Site

But one day, you will stand before its decrepit gate,without really knowing why.

0%

求根到叶子节点数字之和

来源Leetcode第129题求根到叶子节点数字之和

给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。

例如,从根到叶子节点路径 1->2->3 代表数字 123

计算从根到叶子节点生成的所有数字之和。

说明: 叶子节点是指没有子节点的节点。

示例 1:

1
2
3
4
5
6
7
8
9
输入: [1,2,3]
1
/ \
2 3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.

DFS

跟之前写的路径总和差不多,也是要注意DFS在返回时需要去掉最后一个加入的点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int ans = 0;
public int sumNumbers(TreeNode root) {
if(root == null)
return ans;
helper(root,ans);
return ans;
}

public void helper(TreeNode root,int sum){
if(root != null)
sum = sum * 10 + root.val;
else
return;
if(root.left == null && root.right == null)
ans += sum;
if(root.left != null)
helper(root.left,sum);
if(root.right != null)
helper(root.right,sum);
sum /= 10;
return;
}

来源题解
通常还可以用 stack 的思路来解递归的题目。先序非递归的代码我们知道是用 stack 来保存遍历过的元素。而因为本题要记录到叶节点的数字,所以需要一个额外的 stack 来记录数字。每次出 stack 之后,如果是叶子节点,那么加和;如果不是,那么就看左右子树,入 stack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public int sumNumbers(TreeNode root) {
int sum = 0;
if (root == null) return sum;
Stack<TreeNode> nodeStack = new Stack<>();
Stack<Integer> numStack = new Stack<>();
nodeStack.add(root);
numStack.add(0);
while (!nodeStack.isEmpty()) {
TreeNode current = nodeStack.pop();
Integer currentNum = numStack.pop() * 10 + current.val;
if (current.left == null && current.right == null) {
sum += currentNum;
}
if (current.left != null) {
nodeStack.add(current.left);
numStack.add(currentNum);
}
if (current.right != null) {
nodeStack.add(current.right);
numStack.add(currentNum);
}
}
return sum;
}