题目描述
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]3 / \ 9 20 / \ 15 7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1 / \ 2 2 / \ 3 3 / \ 4 4
返回 false 。
限制:
0 <= 树的结点个数 <= 10000
方法一(递归+剪枝)
1.解题思路
定义一个求二叉树深度的方法,如果不是平衡二叉树,深度确定为-1,否则返回正常深度。优化的时候,在左右子树处将深度为-1的剪枝。
2.代码实现
class Solution {
public boolean isBalanced(TreeNode root) {
return getDepth(root)!=-1;
}
public int getDepth(TreeNode root) {
if(root==null) return 0;
int left=getDepth(root.left);
if(left==-1){
return -1;
}
int right=getDepth(root.right);
if(right==-1){
return -1;
}
return Math.abs(left-right)>1?-1:Math.max(left,right)+1;
}
}
3.复杂度分析
- 时间复杂度:需要遍历树中所有节点,所以时间复杂度为O(n)。
- 空间复杂度:最坏情况下,退化为链表,所以空间复杂度为O(n)。
方法二(二叉树递归模板)
1.解题思路
绝大部分二叉树的题目,都可以通过这个模板来做。
- 首先定义一个类,收集题目中条件判断需要的信息,这个题目中需要高度,以及是否是二叉树
- 然后进行递归,递归的终止条件一般是树为空(视具体情况),获取左右子树信息,根据左右子树信息,确定当前树信息
- 最后返回当前树信息
2.代码实现
class Solution {
public boolean isBalanced(TreeNode root) {
return dfs(root).isBalanced;
}
public Info dfs(TreeNode root) {
if(root==null){
return new Info(true,0);
}
Info left=dfs(root.left);
Info right=dfs(root.right);
int Height=Math.max(left.Height,right.Height)+1;
boolean isBalanced=false;
if(left.isBalanced&&right.isBalanced&&Math.abs(left.Height-right.Height)<=1){
isBalanced=true;
}
return new Info(isBalanced,Height);
}
}
class Info{
boolean isBalanced;
int Height;
Info(boolean isBalanced,int Height){
this.isBalanced=isBalanced;
this.Height=Height;
}
}
3.复杂度分析
- 时间复杂度:同方法一,时间复杂度为O(n)。
- 空间复杂度:同方法一,空间复杂度为O(n)。
剑指offer全集入口: 请戳这里