输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
返回 false 。
思路
平衡二叉树:任意节点的左右子树的高度差不超过1
- root==null也是平衡二叉树
- 求左右子树的高度
- 左右子树高度差的绝对值小于等于1
求树的高度:
- 空树返回0
- 递归左子树的高度
- 递归右子树的高度
- 整棵树的高度就是左右子树高度的最大值加1(加1是计算根节点)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isBalanced(TreeNode root) {
if(root==null){
return true;
}
int lHigh=getHigh(root.left);
int rHigh=getHigh(root.right);
return Math.abs(rHigh-lHigh)<=1&&isBalanced(root.left)&&isBalanced(root.right);
}
private int getHigh(TreeNode root){
if(root==null){
return 0;
}
int lHigh=getHigh(root.left);
int rHigh=getHigh(root.right);
return Math.max(lHigh,rHigh)+1;
}
}
复杂度
时间复杂度O(n log n):最差情况满二叉数,遍历所有节点
高度复杂度O(log n)
调用geyHigh()遍历节点数
各层执行时间复杂度O(n)
总体时间复杂度 == 每层执行复杂度× 层数复杂度 = O(N×logN) 。
空间复杂度O(n):最差情况下(树退化为链表时),系统递归需要使用 O(N)O(N) 的栈空间。