leetcode563. 二叉树的坡度,DFS

leetcode563. 二叉树的坡度

给你一个二叉树的根节点 root ,计算并返回 整个树 的坡度 。
一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
整个树 的坡度就是其所有节点的坡度之和。
在这里插入图片描述

示例 1:
在这里插入图片描述
输入:root = [1,2,3]
输出:1
解释:
节点 2 的坡度:|0-0| = 0(没有子节点)
节点 3 的坡度:|0-0| = 0(没有子节点)
节点 1 的坡度:|2-3| = 1(左子树就是左子节点,所以和是 2 ;右子树就是右子节点,所以和是 3 )
坡度总和:0 + 0 + 1 = 1

示例 2:
在这里插入图片描述
输入:root = [4,2,9,3,5,null,7]
输出:15
解释:
节点 3 的坡度:|0-0| = 0(没有子节点)
节点 5 的坡度:|0-0| = 0(没有子节点)
节点 7 的坡度:|0-0| = 0(没有子节点)
节点 2 的坡度:|3-5| = 2(左子树就是左子节点,所以和是 3 ;右子树就是右子节点,所以和是 5 )
节点 9 的坡度:|0-7| = 7(没有左子树,所以和是 0 ;右子树正好是右子节点,所以和是 7 )
节点 4 的坡度:|(3+5+2)-(9+7)| = |10-16| = 6(左子树值为 3、5 和 2 ,和是 10 ;右子树值为 9 和 7 ,和是 16 )
坡度总和:0 + 0 + 0 + 2 + 7 + 6 = 15

示例 3:
在这里插入图片描述
输入:root = [21,7,14,1,1,2,2,3,3]
输出:9

题目分析

这是一个关于二叉树的问题。题目要求计算二叉树的所有节点的倾斜度之和。一个节点的倾斜度定义为该节点的左子树之和与右子树之和的绝对差。

总体思维导图

这里提供一个思维导图的绘制,帮助理解问题和解决方案的结构。

算法步骤

  1. 定义一个全局变量 ans 用于存储所有节点的倾斜度之和。
  2. 实现一个递归函数 dfs,用于计算每个节点的左子树和右子树之和。
  3. dfs 函数中,对于每个节点,计算其左子树和右子树的和,并更新 ans
  4. dfs 函数返回当前节点及其子树的总和。
  5. 主函数 findTilt 调用 dfs 并返回 ans

算法流程图

开始
定义全局变量ans
调用dfs函数
递归计算左右子树之和
更新ans
返回当前节点及其子树的总和
判断是否所有节点已访问
结束

具体代码部分

class Solution {
public:
    int ans = 0;

    int findTilt(TreeNode* root) {
        dfs(root);
        return ans;
    }

    int dfs(TreeNode* node) {
        if (node == nullptr) {
            return 0;
        }
        int sumLeft = dfs(node->left);
        int sumRight = dfs(node->right);
        ans += abs(sumLeft - sumRight);
        return sumLeft + sumRight + node->val;
    } 
};

算法分析

  • 复杂度分析:该算法的时间复杂度是 O(N),其中 N 是树中节点的数量。每个节点只被访问一次。
  • 易错点:在计算倾斜度时,要注意先计算左右子树之和,再更新 ans
  • 注意点:递归函数的终止条件是遇到空节点。

相似题目

题目链接
二叉树的最大路径和Medium
平衡二叉树Easy
路径总和 IIIMedium
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cider瞳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值