输入一棵二叉树,判断该二叉树是否是平衡二叉树
常规做法
- 即实现一个求节点高度的树,然后遍历原二叉树
- 每遇到一个节点,判断其左右子树高度之差是否小于等于1
- 然后递归进入左右子树判断左右子树是否是平衡二叉树
缺点:在求解高度时,存在重复判断的情况,并且该方法无差别的遍历所有节点
public classSolution {
public boolean IsBalanced_Solution(TreeNode root) {
if(root == null) {
return true;
}
return Math.abs(maxDepth(root.left) - maxDepth(root.right)) <= 1 &&
IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
}
private int maxDepth(TreeNode root) {
if(root == null) {
return 0;
}
return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}
}
改进:从最小的叶子节点开始,若一个子树不是平衡树,立即返回-1不在遍历 (避免原方法会遍历所有节点的性能开销)
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
if(depth(pRoot)==-1)
return false;
else
return true;
}
int depth(TreeNode* p)
{
if(p==NULL)
return 0;
int left=depth(p->left);
if(left==-1)
return -1;
int right=depth(p->right);
if(right==-1)
return -1;
if(left-right>1 || right-left>1) //不平衡
return -1;
return max(left+1,right+1);//返回该子树的高度
}
};