目录
平衡二叉树的定义
平衡二叉树的基本操作
查找
插入
AVL树的建立
平衡二叉树的定义
平衡二叉树仍然是一棵二叉查找树,只是在其基础上增加了平衡的要求,也就是其左右子树的高度之差的绝对值不超过1。
在定义树的结构时需要加入一个变量height,用来记录以当前结点为根节点的子树的高度。
struct node{int v,height;node *lchild,*rchild;
};
在这种定义下,如果需要新建一个结点,就可以使用如下写法:
node* newNode(int v){node* Node=new node;Node->v=v;Node->height=1;Node->lchild=Node->rchild=NULL;return Node;
}
显然,可以通过下面的函数获取结点root所在子树的当前高度:
int getheight(node* root){if(root==NULL){return 0;}return root->height;
}
于是根据定义,就可以通过下面的函数计算左右子树的高度差:
int getbalancefactor(node* root){return getheight(root->lchild)-getheight(root->rchild);
}
显然,结点root所在子树的高度等于其左右子树高度的较大值加1.
void updateheight(node* root){root->height=max(getheight(root->lchild),getrchild(root->rchild))+1;
}
平衡二叉树的基本操作
查找
void search(node* root,int x){if(root==NULL){printf("search failed\n");return;}if(x==root->data){printf("%d\n",root->data);}else if(x<root->data){search(root->lchild,x);}else{search(root->rchild,x);}
}
插入
左旋的代码
void L(node* &root){node* temp=root->rchild;root->rchild=temp->lchild;temp->lchild=root;updataheight(root);updataheight(temp);root=temp;
}
右旋的代码
void R(node* &root){node* temp=root->lchild;root->lchild=temp->rchildtemp->rchild=root;updataheight(root);updataheight(temp);root=temp;
}
对于各种树型使用的操作如下:
首先,AVL树的插入代码是在二叉查找树的插入代码的基础上增加平衡操作的,因此,如果不考虑平衡操作,代码是下面这样的:
void insert(node* &root,int v){if(root==NULL){root=newNode(v);return;}if(v<root->data){insert(root->lchild,v);}else{insert(root->rchild,v);}
}
在这个基础上,由于需要从插入的结点开始从下往下判断结点是否失衡,因此需要在每个insert函数之后更新当前子树的高度,并在这之后根据树型是LL型、LR型、RR型、RL型之一来进行平衡操作。
void insert(node* &root,int v){if(root==NULL){root=newNode(v);return;}if(v<root->data){insert(root->lchild,v);updataheight(root);if(getbalancefactor(root)==2){if(getbalancefactor(root->lchild)==1){//L型 R(root);}else if(getbalancefactor(root->lchild)==-1){//LR型 L(root->lchild);R(root);}}}else{insert(root->rchild,v);updataheight(root);if(getbalancefactor(root)==-2){if(getbalancefactor(root->lchild)==-1){//RR型 L(root);}else if(getbalancefactor(root->rchild)==1){//RL型 R(root->rchild);L(root);}}}
}
AVL树的建立
node* Create(int data[],int n){node* root=NULL;for(int i=0;i<n;i++){insert(root,data[i]);}return root;
}