【Leetcode】563. Binary Tree Tilt 解题报告

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dpengwang/article/details/88083166

在这里插入图片描述
求每个节点左右子树节点和差

方法1 递归+全局变量

求出每个节点下的节点和即可

class Solution1:
    def findTilt(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        self.res = 0
        self.getSum(root)
        return self.res

    def getSum(self, root):
        if root == None:
            return 0
        left = self.getSum(root.left)
        right = self.getSum(root.right)
        self.res += abs(left - right)
        return root.val + left + right

方法2 双递归

class Solution2:
    def findTilt(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if root == None:
            return 0
        l =  self.getSum(root.left)
        r =  self.getSum(root.right)
        return abs(l - r) + self.findTilt(root.left) + self.findTilt(root.right)

    def getSum(self, root):
        if root == None:
            return 0
        l = self.getSum(root.left)
        r = self.getSum(root.right)
        return l + r + root.val

方法3 后续非递归遍历+dict

当前节点的和等于当前节点的值加左右节点的和,这是个自下而上的过程,用字典存储每个节点的和,然后上层节点就能通过字典查找到左右节点的和。

class Solution3:
    def findTilt(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        from collections import  defaultdict
        dictionary = defaultdict(int)
        stack = []
        pNode = root
        res = 0
        prev = None
        while(len(stack) or pNode):
            if pNode:
                stack.append(pNode)
                pNode = pNode.left
            else:
                pNode = stack[-1]
                if pNode.right == None or pNode.right == prev:
                    res += abs(dictionary[pNode.left] - dictionary[pNode.right])
                    dictionary[pNode] = pNode.val + dictionary[pNode.left] + dictionary[pNode.right]
                    prev = pNode
                    stack.pop()
                    pNode = None
                else:
                    pNode = pNode.right
        return res

猜你喜欢

转载自blog.csdn.net/dpengwang/article/details/88083166
今日推荐