(Java)leetcode-563 Binary Tree Tilt(二叉樹的坡度)

題目描述

給定一個二叉樹,計算整個樹的坡度。

一個樹的節點的坡度定義即爲,該節點左子樹的結點之和和右子樹結點之和的差的絕對值。空結點的的坡度是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;

    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章