Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as:
a binary tree in which the left and right subtrees of every node differ in height by no more than 1.
Given the following tree [1,2,2,3,3,null,null,4,4]:
1
/ \
2 2
/ \
3 3
/ \
4 4
Return false.
方法一:穷举树高
思路
只有每个节点的左右子树的高度差 diff <= 1 时,该树才是平衡的。所以,求高度就变成了本题的重点
class Solution {
boolean valid=true;
int maxH(TreeNode root) {
if (root==null) return 0;
int l=maxH(root.left), r=maxH(root.right);
if (Math.abs(l-r) > 1) valid=false;
return Math.max(l, r)+1;
}
public boolean isBalanced(TreeNode root) {
if (root==null) return true;
maxH(root);
return valid;
}
}
复杂度分析
- 时间复杂度: O ( n l o g n 或 n 2 ) O(n\ logn\ 或\ n^2) O(n logn 或 n2),假设某个结点的高度为 h,findDepth 至少将会被调用 h 次。
- 空间复杂度: O ( n / l o g ( n ) ) O(n / log(n)) O(n/log(n)),
方法二:自底向上
方法一存在大量的冗余计算。实际上我们可以一步递归到底,然后回溯到某一个结点时,就判断这个结点左右子树的高度差 diff 是否大于 1。
复杂度分析
- 时间复杂度: O ( N 或 l o g ( n ) ) O(N\ 或\ log(n)) O(N 或 log(n)),
- 空间复杂度: O ( N 或 l o g ( n ) ) O(N\ 或\ log(n)) O(N 或 log(n)),
方法三:模板
一棵树为 BST 树时,它的左、右俩子树都是 BST 且俩子树高度差不超过 1。
- 空树自然是平衡二叉树。
- 高度差不超过 1,非 BST.
class ResultNode {
public boolean isBalanced;
public int depth;
public ResultNode(boolean _isBalanced, int _depth) {
isBalanced = _isBalanced;
depth = _depth;
}
}
//主方法
public boolean isBalanced(TreeNode root) {
return dfs(root).isBalanced;
}
//深搜
private ResultNode dfs(TreeNode root) {
if (root == null) return new ResultNode(true, -1);
ResultNode left = dfs(root.left);
ResultNode right = dfs(root.right);
if (left.isBalanced == false || right.isBalanced == false) {
return new ResultNode(false, -1);
} else if (Math.abs(left.depth - right.depth) > 1) {
return new ResultNode(false, -1);
}
return new ResultNode(true, Math.max(left.depth, right.depth) + 1);
}