Loading

【leetcode】563. Binary Tree Tilt

Given the root of a binary tree, return the sum of every tree node's tilt.

The tilt of a tree node is the absolute difference between the sum of all left subtree node values and all right subtree node values. If a node does not have a left child, then the sum of the left subtree node values is treated as 0. The rule is similar if there the node does not have a right child.

 

Example 1:

Input: root = [1,2,3]
Output: 1
Explanation: 
Tilt of node 2 : |0-0| = 0 (no children)
Tilt of node 3 : |0-0| = 0 (no children)
Tilt of node 1 : |2-3| = 1 (left subtree is just left child, so sum is 2; right subtree is just right child, so sum is 3)
Sum of every tilt : 0 + 0 + 1 = 1

Example 2:

Input: root = [4,2,9,3,5,null,7]
Output: 15
Explanation: 
Tilt of node 3 : |0-0| = 0 (no children)
Tilt of node 5 : |0-0| = 0 (no children)
Tilt of node 7 : |0-0| = 0 (no children)
Tilt of node 2 : |3-5| = 2 (left subtree is just left child, so sum is 3; right subtree is just right child, so sum is 5)
Tilt of node 9 : |0-7| = 7 (no left child, so sum is 0; right subtree is just right child, so sum is 7)
Tilt of node 4 : |(3+5+2)-(9+7)| = |10-16| = 6 (left subtree values are 3, 5, and 2, which sums to 10; right subtree values are 9 and 7, which sums to 16)
Sum of every tilt : 0 + 0 + 0 + 2 + 7 + 6 = 15

      这道题需要根据左右子树中节点的和来计算tilt,所以采用递归的方式,从底层往上计算,有个小trick就是对于最终求和的值利用传引用的方式更新数值。

class Solution {
public:
    int findTilt(TreeNode* root) {
        // 首先这就是一个简单的递归
        // 但是这个递归是从最底层开始计算 所以需要注意递归的顺序
        // 需要返回的值 当前节点加和的所有数值 求左右子树的所有节点的和
        //以及当前节点的倾斜值求和(用传引用减少变量)
        int res=0;
        int tmp=digui(root,res);
        return res;
        
    }
    int digui(TreeNode* node,int &res){
        if(node==nullptr) return 0;
        int left=digui(node->left,res);
        int right=digui(node->right,res);
        res+=abs(left-right);
        return (left+right+node->val);
    }
};
posted @ 2021-12-09 00:20  aalanwyr  阅读(27)  评论(0编辑  收藏  举报