力扣 - 110. 平衡二叉树
题目
思路1(自顶向下的递归)
- 要判断是否为平衡二叉树,那么首先就判断他的左右子树高度差有没有超过1,没有超过1的话就继续判断他的左右子树是否为平衡二叉树
- 将大问题分成小问题进行解决,自顶向下
- 判断高度用dfs来计算
代码
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
if (Math.abs(dfs(root.left) - dfs(root.right)) > 1) {
return false;
}
return isBalanced(root.left) && isBalanced(root.right);
}
public int dfs(TreeNode node) {
if (node == null) {
return 0;
}
return Math.max(dfs(node.left), dfs(node.right)) + 1;
}
}
复杂度分析
- 时间复杂度:\(O(N^2)\),其中 N 为树的节点的个数
- 空间复杂度:\(O(N)\),其中 N 为树的节点的个数
思路2(自底向上的迭代)
- 如果使用自顶向下的递归,很多节点会被重复计算,导致时间复杂度很大
- 所以可以使用自底向上方法,有点类似于后序遍历,先遍历最底部左右两个树,如果平衡就返回平衡,一步步向上迭代
- 这样子节点最多只会被计算一次了,不会出现重复计算的问题了
代码
class Solution {
public boolean isBalanced(TreeNode root) {
return height(root) >= 0;
}
public int height(TreeNode node) {
if (node == null) {
return 0;
}
int leftHeight = height(node.left);
int rightHeight = height(node.right);
// 如果左子树不平衡或者右子树不平衡或者当前树不平衡都会返回-1代表树不平衡
if (leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) {
return -1;
} else {
return Math.max(leftHeight, rightHeight) + 1;
}
}
}
复杂度分析
- 时间复杂度:\(O(N)\),其中 N 为树的节点的个数
- 空间复杂度:\(O(N)\),其中 N 为树的节点的个数
我走得很慢,但我从不后退!

浙公网安备 33010602011771号