leetcode 563. 二叉树的坡度 python

题目描述:

 

 

 

简单来说,某个节点的坡度等于其左右子树节点值之和的差值。一个树的坡度等于所有节点的坡度值之和。

题解:

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值