Leetcode 129:二叉树的所有路径(最详细的解法!!!)

版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/82183620

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

解题思路

这个问题几乎和Leetcode 257:二叉树的所有路径(最详细的解法!!!)一模一样,我们直接套用之前方法就可以了。我这里的写法参考了Leetcode 113:二叉树的所有路径(最详细的解法!!!)中最后的回溯写法,如果采用Leetcode 257,会碰到一些问题。

class Solution:
    def _sumNumbers(self, root, value):
        if root:
            if not root.left and not root.right:
                self.result += value*10 + root.val

            self._sumNumbers(root.left, value*10+root.val)
            self._sumNumbers(root.right, value*10+root.val)

    def sumNumbers(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        self.result = 0
        self._sumNumbers(root, 0)
        return self.result

我们知道python语法中,对于不可变参数是通过值传递的,这样的话,我们传递result参数就不能简单的通过形参来传递了,而是要通过全局变量的方式。

同样我们我们希望可以通过递归的方法去解决这个问题。这里我们可以使用Leetcode 257中的写法。

class Solution:
    def sumNumbers(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        result = 0
        if not root:
            return result

        path = [(0, root)]
        while path:
            pre, node = path.pop()
            if node:
                if not node.left and not node.right :
                    result += pre*10 + node.val

                path += [(pre*10 + node.val, node.right), (pre*10 + node.val, node.left)]

        return result

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

猜你喜欢

转载自blog.csdn.net/qq_17550379/article/details/82183620