題目描述
給定一個二叉樹,計算整個樹的坡度。
一個樹的節點的坡度定義即爲,該節點左子樹的結點之和和右子樹結點之和的差的絕對值。空結點的的坡度是0。
整個樹的坡度就是其所有節點的坡度之和。
注意:
任何子樹的結點的和不會超過32位整數的範圍。
坡度的值不會超過32位整數的範圍。
這道題目很容易讀錯題,以爲是每個節點的左右孩子之差,於是應該補充一個更清晰的用例如下:
思路
由上面的用例可以清晰的看到,在計算節點1的坡度時,就需要知道其左右子樹的節點之和,說明應該自下而上進行求和,因此適合這一特點的遍歷應當是後序遍歷。
我們遍歷至某一節點時,先遞歸求出其左右子樹的和,進而可以求出絕對值差,還能求出當前樹的節點和(左+右+自身),並且返回給上一層,實現了自下而上的求和。
代碼
class Solution {
int sum = 0;
public int findTilt(TreeNode root) {
travel(root);
return sum;
}
// 此方法返回值爲傳入節點爲根的樹的節點之和
private int travel(TreeNode root) {
if (root == null) return 0;
// 遞歸求左子樹的節點和
int leftSum = travel(root.left);
// 遞歸求右子樹的節點和
int rightSum = travel(root.right);
//計算該節點的坡度並添加到結果中
sum += Math.abs(leftSum - rightSum);
return leftSum + rightSum + root.val;
}
}