563. 二叉树的坡度

该博客介绍了如何通过后序遍历优化二叉树的坡度计算,避免节点被重复访问,从而提高算法效率。作者提出了一个新的解决方案,利用递归搜索每个节点的子树和及度的和,有效地合并子问题并减少时间浪费。

题目
在这里插入图片描述

我的想法

从根节点开始,求出每个几点的度,然后累加。代码如下:

# 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
def node_Tilt(root):# 每个节点的坡度
    if not root:
        return 0
    if not (root.left or root.right):# 是叶子节点
        return 0
    else:
        return abs(sum_of_sub_tree(root.left) - sum_of_sub_tree(root.right))

def sum_of_sub_tree(root):
    '''
    求当前子树为根节点的和
    :param root:
    :return:
    '''
    if not root:
        return 0
    stack = []
    sum_node = 0#
    last_visit = root
    while stack or root:
        while root:
            # print(root.val)# 先序
            sum_node += root.val
            stack.append(root)
            root = root.left
        root = stack.pop()
        if root.right:
            # print(root.val)# 中序
            root = root.right
        else:
            root = None
    return sum_node

class Solution:
    def findTilt(self, root: TreeNode) -> int:
        if not root:
            return 0
        # a = node_Tilt(root)
        # print('***', root.val, a)
        # l = self.findTilt(root.left)
        # r = self.findTilt(root.right)

        # return a + l + r
        return node_Tilt(root)+self.findTilt(root.left)+self.findTilt(root.right)

有个问题:
是从根节点向下遍历的,根节点一下的节点遍历了多次。造成了时间的浪费。

参考:基于后续遍历的思想求解二叉树的坡度

每次遍历一个节点,返回它的子树和及度的和。

class Solution:
    def findTilt(self, root: TreeNode) -> int:

        def search(root: TreeNode) -> (int, int): # 返回节点和,累积坡度
            if not root:
                return 0, 0
            else:
                sl, pl = search(root.left) # 递归求解子问题
                sr, pr =search(root.right) # 递归求解子问题 
                return sr + sl + root.val, abs(sl - sr) + pl + pr # 跟节点的节点和,累积坡度与子问题的递归关系(合并子问题,形成原问题的解)
        
        _, p = search(root)
        return p

作者:lzx1997
链接:https://leetcode-cn.com/problems/binary-tree-tilt/solution/ji-yu-hou-xu-bian-li-de-si-xiang-qiu-jie-d982/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值