题目描述:
简单来说,某个节点的坡度等于其左右子树节点值之和的差值。一个树的坡度等于所有节点的坡度值之和。
题解:
1.定义一个函数calcsum,输入一个节点node,计算node下面所有子节点的值之和(不包含node节点自身的值)
2.在finTilt函数中,tilt记录树的坡度值,从root开始,对每个节点的左右子树分别调用calcsum计算子节点之和,差值加入tilt中。
class Solution(object): def findTilt(self, root): if root==None: return 0 sumleft = 0 sumright = 0 if root.left: sumleft = self.calcsum(root.left)+root.left.val if root.right: sumright = self.calcsum(root.right) + root.right.val tilt = abs(sumleft-sumright) if root.left: tilt = tilt+self.findTilt(root.left) if root.right: tilt = tilt+self.findTilt(root.right) return tilt def calcsum(self,node):#计算node以下节点值之和(不包括该节点本身) sum = 0 if node==None: return 0 if node.left!=None: sum = sum + node.left.val sum = sum+self.calcsum(node.left) if node.right!=None: sum = sum + node.right.val sum = sum+self.calcsum(node.right) return sum
原思路修改改进版:calcsum以当前输入节点为根结点的子树的所有节点值之和。
class Solution(object): def findTilt(self, root): if root==None: return 0 leftsum = 0 rightsum = 0 if root.left: leftsum = self.calcsum(root.left) if root.right: rightsum = self.calcsum(root.right) tilt = abs(leftsum-rightsum) if root.left: tilt = tilt+self.findTilt(root.left) if root.right: tilt = tilt+self.findTilt(root.right) return tilt def calcsum(self,node): if node==None: return 0 sum = node.val if node.left: sum = sum+ self.calcsum(node.left) if node.right: sum = sum+self.calcsum(node.right) return sum