LeetCode演算法題-Binary Tree Tilt(Java實現)
這是悅樂書的第263 次更新,第276 篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第130題(順位題號是563)。給定二叉樹,返回整棵樹的傾斜度。樹節點的傾斜被定義為所有左子樹節點值的總和與所有右子樹節點值的總和之間的絕對差。 空節點傾斜0。整棵樹的傾斜度定義為所有節點傾斜的總和。例如:
輸入:
1 /\ 23
輸出:1
說明:節點2的傾斜度為0,節點3的傾斜度為0,節點1的傾斜:| 2-3 | = 1,二叉樹的傾斜:0 + 0 + 1 = 1。
注意:
-
任何子樹中的節點值總和不會超過32位整數的範圍。
-
所有傾斜值都不會超過32位整數的範圍。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
根據題目對於傾斜度的定義,當前節點的左子樹所有節點值之和與右子樹所有節點值之和的絕對值就是傾斜度。我們先來看兩個例子:
1 /\ 23 / \/ \ 45 67
上面的二叉樹自上而下可以計算的子樹有三次,一是從根節點1開始,二是從左子樹節點2開始,三是從右子樹節點3開始。
|(2+4+5)-(3+6+7)| = 5
|4-5| = 1
|6-7| = 1
所以該二叉樹的傾斜度是7。
1 / \ 23 / \ 45
上面的二叉樹自上而下可以計算的子樹有兩次,一是從根節點1開始,二是從左子樹節點2開始。
|(2+4+5)-3| = 8
|4-5| = 1
所以該二叉樹的傾斜度是9。
如果從上往下計算,會出現重複計算,所以我們可以從下往上開始計算,使用遞迴的方法,先計算相鄰左右節點的絕對值,然後返回到上一層父節點,附帶加上父節點的節點值,相當於計算了其所在子樹的節點值之和。
private int tilt = 0; public int findTilt(TreeNode root) { getNodeValue(root); return tilt; } public int getNodeValue(TreeNode root) { if (root == null) { return 0; } int left = getNodeValue(root.left); int right = getNodeValue(root.right); tilt += Math.abs(left-right); return left+right+root.val; }
03 第二種解法
還可以使用迭代的方法,依舊是從下往上開始計算,使用棧來實現,藉助其先進後出的特性,在最後計算根節點的左右子樹。中間還使用了HashMap,以節點為key,所在子樹累加的節點值為value。
public int findTilt2(TreeNode root) { if (root == null) { return 0; } int sum = 0; Stack<TreeNode> stack = new Stack<TreeNode>(); Map<TreeNode, Integer> map = new HashMap<TreeNode, Integer>(); stack.push(root); while (!stack.isEmpty()) { TreeNode node = stack.peek(); if ((node.left == null || map.containsKey(node.left)) && (node.right == null || map.containsKey(node.right))) { stack.pop(); int left = map.containsKey(node.left) ? map.get(node.left) : 0; int right = map.containsKey(node.right) ? map.get(node.right) : 0; sum += Math.abs(left - right); map.put(node, left + right + node.val); } else { if (node.left != null && !map.containsKey(node.left)) { stack.push(node.left); } if (node.right != null && !map.containsKey(node.right)) { stack.push(node.right); } } } return sum; }
04 小結
演算法專題目前已日更超過三個月 ,演算法題文章130 +篇,公眾號對話方塊回覆【資料結構與演算法 】、【演算法 】、【資料結構 】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!