版权声明:本文为博主原创文章,未经博主允许不得转载。 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