1 """ 2 Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. 3 An example is the root-to-leaf path 1->2->3 which represents the number 123. 4 Find the total sum of all root-to-leaf numbers. 5 Note: A leaf is a node with no children. 6 Example: 7 Input: [1,2,3] 8 1 9 / 10 2 3 11 Output: 25 12 Explanation: 13 The root-to-leaf path 1->2 represents the number 12. 14 The root-to-leaf path 1->3 represents the number 13. 15 Therefore, sum = 12 + 13 = 25. 16 Example 2: 17 Input: [4,9,0,5,1] 18 4 19 / 20 9 0 21 / 22 5 1 23 Output: 1026 24 Explanation: 25 The root-to-leaf path 4->9->5 represents the number 495. 26 The root-to-leaf path 4->9->1 represents the number 491. 27 The root-to-leaf path 4->0 represents the number 40. 28 Therefore, sum = 495 + 491 + 40 = 1026. 29 """ 30 """ 31 本题两种解法 32 第一种为递归 33 """ 34 35 class TreeNode: 36 def __init__(self, x): 37 self.val = x 38 self.left = None 39 self.right = None 40 41 class Solution1: 42 def sumNumbers(self, root): 43 self.res = 0 # !!!res申请为全局变量,保存总的结果 44 self.sum(root, 0) # !!!第一次传0值是为了递归的时候传入正确的根结点值 45 return self.res 46 47 def sum(self, root, value): 48 if root: 49 if root.left == None and root.right == None: # !!!判断叶子结点 50 self.res += 10 * value + root.val 51 self.sum(root.left, 10 * value + root.val) 52 self.sum(root.right, 10 * value + root.val) 53 54 """ 55 非递归的写法,先用tuple存储(value, root) 56 然后入队列遍历 57 """ 58 59 class Solution2: 60 def sumNumbers(self, root): 61 res = 0 62 if root == None: 63 return res 64 queue = [] 65 x = (0, root) # tuple元组,(父亲结点的值,结点) 66 queue.append(x) 67 while queue: 68 value, node = queue.pop() # 头结点出队 69 if node: 70 if not node.left and not node.right: # 判断叶子结点,加各个路径的和 71 res = res + node.val + value * 10 72 queue += [(node.val + 10 * value, node.left), (node.val + 10 * value, node.right)] 73 # 层次遍历 也可以用queue.extend([(, ), (, )])来写 74 return res