题目
给定二叉树的根节点root,判断该二叉树是否是平衡二叉树。
分析实现
平衡二叉树(AVL树):任意结点的平衡因子(结点左子树的高度 - 右子树的高度)的绝对值不超过1。
直观地去想,判断二叉树某个结点是否满足平衡条件,就需要先计算出左右子树的高度。那么一个简单的思路就是通过计算二叉树高度函数的辅助,完成平衡二叉树的判断。
不过,在此之上还可以进行改进。通过子树高度判断每个结点是否满足平衡条件会涉及到很多高度的重复计算,为提高效率,可以将结点的高度存储到数组中;或者更进一步地,在计算二叉树高度时就考虑平衡条件,不平衡时返回一个特殊值而不是二叉树的高度。
具体实现如下:
// 返回平衡二叉树的高度 - 不平衡时返回-1
int height(BTNode *root){
if(root==NULL)
return 0;
int hLeft = height(root->left);
if(hLeft==-1) return -1;
int hRight = height(root->right);
if(hRight==-1) return -1;
if(abs(hLeft-hRight) > 1)
return -1;
return max(hLeft, hRight) + 1;
}
// 判断二叉树是否平衡
bool isBalanced(BTNode *root){
if(root==NULL)
return true;
return height(root)!=-1;
}
分析总结
以上就是判断平衡二叉树的实现,此处对计算二叉树高度函数进行修改,通过限定后的平衡二叉树高度,能够高效地判断二叉树是否是平衡二叉树。