【LeetCode 中等题】59-求根到叶子节点数字之和

题目描述:给定一个二叉树,它的每个结点都存放一个 0-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.

解法1。DFS做法,和求二叉树路径之和是一个思路,只是逻辑略微不一样,遇到叶子结点就把path放到res里,最后遍历res,求和,注意回溯要pop,还有类型转换的问题。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def sumNumbers(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        path = []
        res = []
        self.helper(root, path, res)
        fi = 0
        for path in res:
            num = int(''.join(path))
            fi += num
        return fi
    
    def helper(self, root, path, res):
        if not root:
            return
        path.append(str(root.val))
        if not root.left and not root.right:
            res.append(path[:])
        self.helper(root.left, path, res)
        self.helper(root.right, path, res)
        path.pop()

# 参照做法2,可知上段代码可以优化一下,path可以改成一个数字,就是截至目前的累积的数字
class Solution(object):
    def sumNumbers(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        res = []
        self.helper(root, root.val, res)
        return sum(res)
    
    def helper(self, root, val, res):
        if not root:
            return
        if not root.left and not root.right:
            res.append(val)
            return
        if root.left:
            self.helper(root.left, val*10+root.left.val, res)
        if root.right:
            self.helper(root.right, val*10+root.right.val, res)

解法2。用循环,思路和递归基本一致,不过是BFS,用stack存放要被遍历的节点,但stack维护的元素内容是节点和截至目前的数字构成的二元组,res记录叶子节点的数字,也就是遍历到该叶子结点得到的数,返回res内数的和。

class Solution(object):
    def sumNumbers(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        stack = [(root, root.val)]
        res = []
        while stack:
            node, val = stack.pop(0)
            if not node.left and not node.right:
                res.append(val)
            else:
                if node.left:
                    stack.append((node.left, val*10+node.left.val))
                if node.right:
                    stack.append((node.right, val*10+node.right.val))
        return sum(res)

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/86094208