题目描述 给定一个仅包含数字 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 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%的用户
-------------本文结束 感谢您的阅读-------------
文章对您有帮助,可以打赏一杯咖啡,鼓励我继续创作!