129 - 求根到叶子节点数字之和 - Python + Java

    科技2022-08-07  104

    给定一个二叉树,它的每个结点都存放一个 10-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径1->2->3 代表数字123。计算从根到叶子节点生成的所有数字之和。

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

    示例 1:

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

    示例 2:

    输入: [4,9,0,5,1] 4 / \ 9 0 / \ 5 1 输出: 1026 解释: 从根到叶子节点路径 4->9->5 代表数字 495. 从根到叶子节点路径 4->9->1 代表数字 491. 从根到叶子节点路径 4->0 代表数字 40. 因此,数字总和 = 495 + 491 + 40 = 1026.

    题目要求每条根节点到叶子节点的路径所表示的数字之和,因此,我们需要从根节点深度遍历所有可能的路径,并记录路径上的节点的val,最后统计每个路径表示的数字之和即可。思想简单,直接上代码:

    # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def sumNumbers(self, root: TreeNode) -> int: if not root: return 0 r = [] def track(root, path): if not root: return if not root.left and not root.right: # 已经到达叶子节点 path.append(str(root.val)) # 完整的一条路径 for i in range(len(path)): # 去除前面可能的'0' if path[i] != '0': r.append(eval(''.join(path[i:]))) # 使用eval()得到字符串表示的int型数值,保存到r break path.pop() # 弹出 return path.append(str(root.val)) # 做选择 track(root.left, path) # 遍历左子树 track(root.right, path) # 遍历右子树 path.pop() # 撤销选择 track(root, []) return sum(r) # 求和

    或者在path直接累积节点的val值,最后再进行保存,代码如下所示:

    class Solution: def sumNumbers(self, root: TreeNode) -> int: if not root: return 0 r = [] def track(root, path): if not root: return if not root.left and not root.right: path = path * 10 + root.val r.append(path) path = (path - root.val) / 10 return path = path * 10 + root.val track(root.left, path) track(root.right, path) path = (path - root.val) / 10 track(root, 0) return sum(r)

    相应的Java解题代码如下:

    class Solution { public int number = 0; public int sumNumbers(TreeNode root) { if(root == null){ return 0; } track(root, number); return number; } public void track(TreeNode root, int n){ if(root == null){ return; } if(root.left == null && root.right == null){ n = n * 10 + root.val; number += n; n = (n - root.val) / 10; return; } n = n * 10 + root.val; track(root.left, n); track(root.right, n); n = (n - root.val) / 10; } }
    Processed: 0.009, SQL: 8