题目:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3 代表数字 123。
计算从根到叶子节点生成的所有数字之和。
输入: [1,2,3]
1
/ \
2 3
输出: 25
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.
1. 回溯, 用列表存每个路径和,太麻烦了:
public int sumNumbers(TreeNode root) {
return DFS(root, new LinkedList<>());
}
public int DFS(TreeNode root, LinkedList<Integer> path) {
if (root == null) return 0;
path.addLast(root.val);
if (root.left == null && root.right == null) {
int sum = 0;
for (int num : path) sum = sum * 10 + num;
path.removeLast();
return sum;
}
int leftDFSum = DFS(root.left, path);
int rightDFSum = DFS(root.right, path);
path.removeLast();// 回溯的是root节点,所以要在左右递归之后弹出
return leftDFSum + rightDFSum;
}
2. 优化,不用回溯,直接取节点值就好了,用完就舍弃,存它干吗?!
public int sumNumbers(TreeNode root) {
return helper(root, 0);
}
// helper返回以root为根的ans,sum是访问root之前的路径和
int helper( TreeNode root, int sum) {
if (root == null) return 0;
sum = 10 * sum + root.val;
if (root.left == null && root.right == null) {
return sum;
}
return helper(root.left, sum) + helper(root.right, sum);
}