LeetCode做题记录 05

本文介绍了一种通过后序遍历算法计算二叉树坡度的方法。文章详细解释了如何利用递归思想,从叶子节点开始计算每个节点的坡度,并最终得到整棵树的坡度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树的坡度

点击这里查看原题

题目描述

给定一个二叉树,计算 整个树 的坡度 。

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

在这里插入图片描述

分析

既然我们要求所有节点的坡度,那么我们必定要遍历每一个节点,三种方法,前序中序后序,而我们发现,叶子结点的坡度必定为0,因此我们可以从叶子结点来出发,既然每一个结点的坡度都等于其左子树所有节点的和与其右子树所有节点的和之差的绝对值,那么我们就先使用后序遍历算法来求。

在后序遍历中,我们可以做一点小改进:只要遇到了叶子结点,我们就直接返回,如果没有遇到叶子结点,就把当前节点的值加上其左节点的与右结点的值,因为我们是从叶子几点出发!因此在之后的递归中,每一个非叶子结点已经保存了其左子树所有节点的和与其右子树所有节点的和了!

代码

class Solution {
    private int ans = 0;
    public int findTilt(TreeNode root) {
        postorder(root);
        return ans;
    }
    public void postorder(TreeNode root){
        if(root == null) return ;
        //遇到叶子结点返回
        if(root.left == null && root.right==null) return; 
        postorder(root.left);
        postorder(root.right);  
        //注意,如果左子树或者右子树为空,我们就认为其坡度为0,因此用一个三目运算来代替 
        root.val = root.val + 
        (root.left==null?0:root.left.val)
         + (root.right==null?0:root.right.val);
        
        ans += Math.abs((root.left==null?0:root.left.val) - (root.right==null?0:root.right.val));
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值