给定一个二叉树,计算整个树的坡度。
一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。
整个树的坡度就是其所有节点的坡度之和。
示例:
输入:
1
/ \
2 3
输出: 1
解释:
结点的坡度 2 : 0
结点的坡度 3 : 0
结点的坡度 1 : |2-3| = 1
树的坡度 : 0 + 0 + 1 = 1
注意:
任何子树的结点的和不会超过32位整数的范围。
坡度的值不会超过32位整数的范围。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-tilt
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
求所有节点的坡度和,就是把每一个节点的坡度陡加起来
那么每一个节点的坡度如何求?
就是用这个节点的左子树的节点和 和 右子树的节点的差的绝对值
所以问题就变成了给定一个节点,求这个节点下的子树和
那么这里用前序,中旭,还是后序更好呢 ?
答案是后序,对根节点处理之前,我们已经遍历了左子树和右子树,也就是说求根节点的坡度的时候这个节点的左子树的和 右子树的和都已经知道了,这不就是我们想要的吗. 两者做差求绝对值,就是当前跟节点的坡度.
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int tilt=0;
int findTilt(TreeNode* root)
{
int ret = traverse(root);
cout<<ret<<endl;
return tilt;
}
int traverse(TreeNode* root)
{
if(root == NULL )
return 0;
int left=traverse(root->left);
int right=traverse(root->right);
tilt+=abs(left-right);
return left+right+root->val;
}
};