二叉树根节点到叶子节点的所有路径和

题目描述

给定一个仅包含数字 0 − 9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。
例如根节点到叶子节点的一条路径是 1 → 2 → 3 ,那么这条路径就用 123 来代替。
计算根节点到叶子节点的所有路径表示的数字之和。
示例 1:

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

提示:

  • 树中节点的数目在范围 [1, 1000]
  • 0 <= Node.val <= 9
  • 树的深度不超过 10

题目链接

Leetcode

题目解答

解法一

深度优先遍历,每次计算当前节点所代表的值,到达叶子节点,也就是一个节点的左、右节点都为空,返回节点值,累加每层左、右路径之和即可得到最终结果。

时间复杂度:$O(n)$ 空间复杂度:$O(n)$

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
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int sumNumbers(TreeNode root) {
return dfs(root,0);
}

public int dfs(TreeNode root, int sum) {
if (root == null) return 0;
sum = sum * 10 + root.val;
int left = dfs(root.left,sum);
int right = dfs(root.right,sum);
if (root.left == null && root.right == null) {
return sum;
}
return left + right;
}
}

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:35.7 MB, 在所有 Java 提交中击败了90.88%的用户

解法二

广度优先遍历,使用两个队列分别记录节点和值,只有节点是叶子节点的时侯才累加到总和中,其他情况仅记录节点当前路径所表示的值,队列中节点为空的时侯,就能得到所有路径和。

时间复杂度:$O(n)$ 空间复杂度:$O(n)$

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
class Solution {
public int sumNumbers(TreeNode root) {
if (root == null) return 0;
LinkedList<TreeNode> nodeQueue = new LinkedList<>();
LinkedList<Integer> numQueue = new LinkedList<>();
nodeQueue.add(root);
numQueue.add(root.val);
int sum = 0;
while (!nodeQueue.isEmpty()) {
int size = nodeQueue.size();
for (int i = 0; i < size; i++) {
int num = numQueue.poll();
TreeNode node = nodeQueue.poll();
TreeNode left = node.left, right = node.right;
if (left == null && right == null) {
sum += num;
} else {
if (left != null) {
nodeQueue.add(left);
numQueue.add(num * 10 + left.val);
}
if (right != null) {
nodeQueue.add(right);
numQueue.add(num * 10 + right.val);
}
}
}
}
return sum;
}
}

执行用时:1 ms, 在所有 Java 提交中击败了26.33%的用户
内存消耗:36 MB, 在所有 Java 提交中击败了56.73%的用户

-------------本文结束 感谢您的阅读-------------

文章对您有帮助,可以打赏一杯咖啡,鼓励我继续创作!