《LeetCode之每日一题》:211.二叉树的坡度

二叉树的坡度


题目链接: 二叉树的坡度

有关题目

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

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

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

提示:

树中节点数目的范围在 [0, 10^4]-1000 <= Node.val <= 1000

题解

法一:递归
参考官方题解评论区下xqxls

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int findTilt(TreeNode* root) {
        if (root == nullptr)
            return 0;

        return dfs(root) + findTilt(root->left) + findTilt(root->right);
    }

    //dfs()拿到当前节点的坡度值
    int dfs(TreeNode *node)
    {
        if (node == nullptr)
            return 0;
            
        return abs(sum(node->left) - sum(node->right));
    }

    //sum()拿到当前节点树的节点之和
    int sum(TreeNode *node)
    {
        if (node == nullptr)
            return 0;
        
        int sumLeft = sum(node->left);
        int sumRight = sum(node->right);

        return sumLeft + sumRight + node->val;
    }

};

在这里插入图片描述

法二:深度优先搜索
参考官方题解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
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;
    }
};

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值