代码讲解:https://www.bilibili.com/video/BV1Ga4y1J7hx/
平衡二叉树的要点:
①左子树平衡
②右子树平衡
③左右子树高度差绝对值不超过1
掌握这三个要点就可以开始写递归程序的出入口
出口①:空树,则高度为0,平衡因子为1
出口②:只有根节点,高度为1,平衡因子为1
出口③:递归完左右子树以后,得到左右子树的平衡因子,判断平衡因子是否都为1(即都平衡,都平衡则以当前节点为根的树都平衡),把当前树的高度保存在h变量中,结束这一层的递归算法。
入口①:递归左子树
入口②:递归右子树
void Judge_AVL(BiTree bt, int &balance, int &h){
//参数加了引用符,改变变量的值会改变上层调用算法时的变量的值
int bl = 0,br = 0, hl = 0, hr = 0;
if(bt==NULL){
h = 0;
balance = 1;//空树的平衡因子为1
}else if(bt->lchild==NULL&&bt->rchild==NULL){
h=1;//只有根节点,高度为1
balance=1;
}else{
Judge_AVL(bt->lchild,bl,hl);//递归左子树
Judge_AVL(bt->rchild,br,hr);//递归右子树
h=(h1>hr?hl:hr)+1;
if(abs(hl-hr)<2)//左右高度差绝对值小于1
balance=bl&&br;//当左右子树都平衡时,则以当前节点为根节点的树也平衡
else
banance = 0;
}
}