题目:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
方法一:自顶向下,先序遍历,判断深度
递归判断每个系是不是平衡二叉树,即左右结点的高度差在 1 之内,这里要用到上一题的代码,求树的深度。
容易想到,但是计算深度的时候,会产生大量的重复计算,时间复杂度较高
- 时间复杂度 O(nlogn)
- 空间复杂度 O(n)
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
if (Math.abs(height(root.left) - height(root.right)) <= 1) {
return isBalanced(root.left) && isBalanced(root.right);
}
return false;
}
// 求树的深度
int height(TreeNode root) {
if (root == null) {
return 0;
}
return Math.max(height(root.left), height(root.right)) + 1;
}
}
方法二:自底向上
思路:对二叉树进行后续遍历,从底到顶返回子树深度,如果子树不是平衡二叉树,直接返回进行剪枝
- 时间复杂度 O(n)
- 空间复杂度 O(n)
class Solution {
public boolean isBalanced(TreeNode root) {
return recur(root) != -1;
}
int recur(TreeNode root) {
if (root == null) {
return 0;
}
int left = recur(root.left);
if (left == -1) {
return -1;
}
int right = recur(root.right);
if (right == -1) {
return -1;
}
return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
}
}