目录
一、题目
二、思路
Ⅰ、
1.一棵树要是平衡二叉树,那么它的每颗子树都要是平衡二叉树
2.root左树的高度-右树的高度<=1
时间复杂度:O(n^2),其中 n是二叉树中的节点个数。
最坏情况下,二叉树是满二叉树,需要遍历二叉树中的所有节点,时间复杂度是 O(n)。
对于节点 p,如果它的高度是 d,则 height(p) 最多会被调用 d 次(即遍历到它的每一个祖先节点时)。对于平均的情况,一棵树的高度 h 满足 O(h)=O(logn),因为 d≤h,所以总时间复杂度为 O(nlogn)。对于最坏的情况,二叉树形成链式结构,高度为 O(n),此时总时间复杂度为 O(n^2)。如图所示:二叉树形成链式结构
空间复杂度:O(n),其中 n 是二叉树中的节点个数。空间复杂度主要取决于递归调用的层数,递归调用的层数不会超过 n。
Ⅱ、
在求高度的同时判断它是否为平衡二叉树,我们希望它是时间复杂度可以达到O(n)
三、代码实现
Ⅰ、
class Solution {
public int height(TreeNode root){
if(root == null){
return 0;
}
int leftHeight = height(root.left);
int rightHeight = height(root.right);
return (leftHeight > rightHeight) ? leftHeight + 1 : rightHeight + 1;
}
public boolean isBalanced(TreeNode root) {
if(root == null){
return true;
}
int left = height(root.left);
int right = height(root.right);
return Math.abs(left - right) <= 1 && isBalanced(root.left) && isBalanced(root.right);
}
}
Ⅱ、
class Solution {
public int height(TreeNode root){
if(root == null){
return 0;
}
int leftHeight = height(root.left);
int rightHeight = height(root.right);
if(leftHeight>=0 && rightHeight>=0 && Math.abs(leftHeight-rightHeight)<=1){
return Math.max(leftHeight,rightHeight)+1;
}else{
return -1;//说明不平衡
}
}
public boolean isBalanced(TreeNode root) {
if(root == null){
return true;
}
return height(root) >=0;
}
}