【声明】
非商业用途,仅供各位学习!
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-tilt
给定一个二叉树,计算 整个树 的坡度 。
一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
整个树的坡度就是其所有节点的坡度之和。
示例1:
将 求整个树的坡度 分成求每一个节点的坡度!
先求节点2和节点3的坡度,由于两个节点都是叶子节点,所以:
节点2的坡度 = | 0 - 0 | = 0
节点3的坡度 = | 0 - 0 | = 0
再求节点1的坡度:等于左子树之和 减去 右子树之和 的绝对值
节点1的坡度 = | 2 - 3 | = 1
此二叉树的总坡度就是:0 + 0 + 1 = 1
代码解法:
class Solution {
public:
int findTilt(TreeNode* root) {
int sum = 0; //用sum保存总坡度
find(root, sum);
return sum;
}
int find(TreeNode* root,int& sum){ //递归求解
//递归终止条件
if(root == nullptr){
return 0; //空节点的坡度为0
}
int left, right; //保存左子树和右子树的坡度
left = find(root->left, sum); //得到左子树之和
right = find(root->right, sum); //得到右子树之和
sum += abs(left - right); //求得当前节点的坡度并保存
return root->val + left + right; //返回当前子树节点之和
}
};