平衡二叉树AVL树是一棵二叉查找树,对AVL树的任意结点来说,其左子树和右子树的高度差的绝对值不超过1.
其中左右子树的高度之差称为该结点的平衡因子;
struct node{
int v,height;//v为结点的权值,height为结点的高度
node * lchild, *rchild;
}
//创建一个节点,权值为v
node * NewNode(int v){
node * Node = new node;
Node->v = v;
Node->height = 1; //节点高度初始为1
Node->lchild=Node->rchild=NULL;
return Node;
}
//获取节点高度
int getHeight(node * root){
if(root == NULL){
return 0;
}
return root->height;
}
//计算节点的平衡因子
int getBalanceFactor(node * root)
{
return getHeight(root->lchild) - getHight(root->rchild);
}
//更新节点高度
void updateHeight(node * root){
root->Height =max(getHeight(root->lchild),getHeight(root->rchild))+1;
}
查找操作和二叉查找树相同
void search(node*root,int x){
if(root ==NULL){
return;
}
if(x==root->v){
printf("%d\n",root->v);
}else if(x<root->v){ //如果x比根结点的数据域小,说明在左子树
search(root->lchild,x); //往左子树搜索
}else{ //x比根结点的数据域大,说明在右子树
search(root->rchild,x); //往右子树搜索
}
}
比较麻烦的是插入操作,记录完成插入操作后,剩下的篇目里就带着记录一点点算法。贪多嚼不烂,够用就好。
左旋: 需要满足A比B小但是,并且A比B的lchild的数据也小,这样A取代原先B的lchild的位置,B原来的lchild变成A的rchild
void L(node * &root)
{
node * temp =root->rchild;
root->rchild = temp->lchild;
temp->lchild = root;
updateHeight(root); //更新节点A的高度
updateHeight(temp); //更新节点B的高度
root = temp;
}
右旋 :B大于A的rchild,并且B大于A,B取代A的rchild位置,原先A的rchild成为B的lchild
void R(node * & root){
node * temp = root->lchild ;
root->lchild = temp=>rchild ;
temp->rchild = root;
updateHeight(root);
updateHeight(temp);
root = temp;
}