力扣LeetCode #110 平衡二叉樹(IsBalanced)
阿新 • • 發佈:2021-02-03
- 題目描述
給定一個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為:一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1 。
提示:
- 樹中的節點數在範圍 [0, 5000] 內
- -104 <= Node.val <= 104
來源:LeetCode
- 示例
- 示例 1:
輸入:root = [3,9,20,null,null,15,7]
輸出:true - 示例 2:
輸入:root = [1,2,2,3,3,null,null,4,4]
輸出:false - 示例 3:
輸入:root = []
輸出:true
- 思路分析
- 要注意的是,本題中的高度平衡不具有最優子結構,因為父節點高度平衡,子節點不一定平衡,反之,子節點高度平衡,父節點也不一定高度平衡。
- 兩個子節點都高度平衡 + 和兄弟節點的高度差的絕對值不超過1 = 父節點高度平衡
- JAVA實現
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isBalanced(TreeNode root) {
//不具有最佳子結構
//子節點高度平衡 + 和兄弟節點高度差不超過1 = 父節點高度平衡
if(root == null || (root.left == null && root.right == null)) return true; //base case
else if(isBalanced(root.left) && isBalanced(root.right)) { //子節點都高度平衡
if(Math.abs(height(root.left)-height(root.right)) <= 1) return true; //高度差的絕對值不超過1
else return false;
}
else return false;
}
public int height(TreeNode root) {
if(root == null) return 0;
else return 1 + Math.max(height(root.left), height(root.right));
}
}