563. 二叉树的坡度

这篇博客介绍了如何解决二叉树的坡度问题,通过递归算法实现节点坡度的计算,最终得到整棵树的坡度。解题思路包括定义递归函数、确定递归结束条件和等价关系式。代码示例展示了两种实现方式,一是使用普通类方法,二是利用闭包。博客提供了详细的代码注释和参考资料。
摘要由CSDN通过智能技术生成

563. 二叉树的坡度

原始题目链接:https://leetcode-cn.com/problems/binary-tree-tilt/
给定一个二叉树,计算 整个树的坡度 。

一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。

整个树 的坡度就是其所有节点的坡度之和。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解题思路:

根据题意,需要任意节点的坡度,最后累加坡度获得整棵树的坡度。典型的使用递归方法解题,具体实现看代码及注释。
递归三要素:

  1. 定义递归函数的功能
  2. 寻找递归结束条件
  3. 找出递归函数的等价关系式

代码实现:

使用普通类方法实现:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    # 定义最终返回的答案,并初始化为0
    def __init__(self):
        self.ans = 0
    def findTilt(self, root: TreeNode) -> int:
        if not root:
            return  0
        self.dfs(root)
        return self.ans
    
    # 定义一个深度优先搜索的递归函数(左、右、根的顺序)
    # 递归三要素:
    #           1)递归函数的功能:返回任意节点的左右子树的节点和(包括这个任意节点的自身节点值),即node.val + dfs(node.left) + dfs(node.right)
    #           2)递归结束条件:空节点返回0
    #           3)递归函数的等价关系式:dfs(当前节点的左右子节点)
    # 答案每次递归的时候都累加当前遍历节点的左子树的节点之和和右子树节点之和的差的绝对值,递归回溯到根节点之后,就是最后的答案。
    def dfs(self, root):
        if not root:
            return 0
        left = self.dfs(root.left)
        right = self.dfs(root.right)
        self.ans += abs(left - right)
        return left + right + root.val

使用闭包函数实现:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def findTilt(self, root: TreeNode) -> int:
        res  = 0
        def dfs(root):
            nonlocal res 
            if not root: return 0
            left = dfs(root.left)
            right = dfs(root.right)
            res += abs(left - right)
            return root.val + left + right
        
        dfs(root)
        return res

参考文献:
https://leetcode-cn.com/problems/binary-tree-tilt/solution/er-cha-shu-de-po-du-by-leetcode/
https://leetcode-cn.com/problems/binary-tree-tilt/solution/quan-ju-bian-liang-hou-xu-bian-li-by-powcai/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值