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

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《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;
    
;

以上是关于《LeetCode之每日一题》:211.二叉树的坡度的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:237.二叉树的最小深度

LeetCode 993. 二叉树的堂兄弟节点——每日一题

LeetCode 993. 二叉树的堂兄弟节点——每日一题

LeetCode 993. 二叉树的堂兄弟节点——每日一题

leetcode每日一题:(2020-05-10):236.二叉树的最近公共祖先

leetcode每日一题:(2020-05-10):236.二叉树的最近公共祖先