Binary Tree Tilt
问题描述:
给定一个二叉树,计算整个树的坡度。
一个树的节点的坡度定义即为,该节点左子树的节点之和和右子树节点之和的差的绝对值。空节点的坡度是0。
整个树的坡度就是其所有节点的坡度之和。
问题解决:问题所要求的是整个树所有节点的坡度之和,而坡度等于节点左子树的节点之和右子树节点之和的差的绝对值,所以我们要必须计算出所有节点的坡度。这种二叉树问题很容易想到用递归来实现,假设有一颗二叉树只有两层,一个根节点带着其左右两个子树,可以知道两个子节点的坡度都为0,根节点的坡度为左节点之和减去右节点之和,因为二叉树只有两层,故根节点的坡度为左子树减去右子树。那给到任意二叉树,我们要做的就是分别算出任意节点的左子树的节点之和与右子树的节点之和,然后就可以算出坡度之和。
class Solution {
public:
int findTilt(TreeNode* root) {
findtilt(root);
return tilt;
}
int findtilt(TreeNode *root){
if(!root)
return 0;
int lchild=findtilt(root->left);
int rchild=findtilt(root->right);
//坡度等于左节点之和减去右节点之和
tilt+=abs(lchild-rchild);
//返回左/右节点之和
return lchild+rchild+root->val;
}
private:
int tilt=0;
};