二叉树的坡度
点击这里查看原题
题目描述
给定一个二叉树,计算 整个树 的坡度 。
一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
整个树 的坡度就是其所有节点的坡度之和。
分析
既然我们要求所有节点的坡度,那么我们必定要遍历每一个节点,三种方法,前序中序后序,而我们发现,叶子结点的坡度必定为0,因此我们可以从叶子结点来出发,既然每一个结点的坡度都等于其左子树所有节点的和与其右子树所有节点的和之差的绝对值,那么我们就先使用后序遍历算法来求。
在后序遍历中,我们可以做一点小改进:只要遇到了叶子结点,我们就直接返回,如果没有遇到叶子结点,就把当前节点的值加上其左节点的与右结点的值,因为我们是从叶子几点出发!因此在之后的递归中,每一个非叶子结点已经保存了其左子树所有节点的和与其右子树所有节点的和了!
代码
class Solution {
private int ans = 0;
public int findTilt(TreeNode root) {
postorder(root);
return ans;
}
public void postorder(TreeNode root){
if(root == null) return ;
//遇到叶子结点返回
if(root.left == null && root.right==null) return;
postorder(root.left);
postorder(root.right);
//注意,如果左子树或者右子树为空,我们就认为其坡度为0,因此用一个三目运算来代替
root.val = root.val +
(root.left==null?0:root.left.val)
+ (root.right==null?0:root.right.val);
ans += Math.abs((root.left==null?0:root.left.val) - (root.right==null?0:root.right.val));
}
}