1、描述
给定一个二叉树,计算 整个树 的坡度 。
一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
整个树 的坡度就是其所有节点的坡度之和。
来源力扣(LeetCode链接
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
二叉树,左子树右子树权值做差,每层累加
3、思路
递归,递归函数返回值不是void而是int,递归函数返回当前节点和左右子树的权值之和,并做出当前节点坡度的值!坡度的值使用一个全局变量保存起来,而递归返回值,作为统计权值的结果
4、notes
递归函数,通过一个全局变量保存结果,返回值可以作为统计当前节点和其子树的权值之和,
5、复杂度
时间:O(N)
空间:O(h)树高
6、code
/**
* 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 tilt =0; // 当前节点的坡度,
int traceback(TreeNode* root){
if(!root) return 0; // 只看当前节点,如果是空节点,就返回0,递归每层就只看当前节点,
int lres = traceback(root->left); // 左子树的权值
int rres = traceback(root->right); // 右子树的权值
tilt += abs(lres - rres); // 到当前节点的坡度,
return root->val + lres + rres; // 递归函数,返回当前节点和当前节点的左右子树的权值之和
}
int findTilt(TreeNode* root) {
traceback(root);
return tilt;
}
};