目录
详细内容请参见《算法笔记》P319
初始AVL树,一知半解,目前不是很懂要如何应用,特记录下重要内容,以供今后review。
平衡二叉树简介:
平衡二叉树由两位前苏联科学家提出,并以两者的名字命名,故称AVL树。
AVL树是一棵二叉搜索树(BST),平衡指的是对AVL树的任意结点,其左子树和右子树高度之差的绝对值不超过1。
左子树和右子树的高度之差称为该结点的平衡因子。
AVL树是对BST的调整,使树的高度在每次插入元素后仍然能保持O(logn)的级别。
各种操作实现代码:
下面给出与AVL树相关操作的实现代码(左旋和右旋问题以及后面的insert函数中的内容就不再此处赘述了,详情请看书上的内容)
建立NODE:
struct NODE{
int v,height;//v表示结点权值,height为当前子树高度
NODE * lchild,*rchild;//左右孩子
};
新建结点:
NODE* newnode(int v)
{
NODE* node=new NODE;
node->v=v;
node->height=1;//结点高度初始化为1
node->lchild=node->rchild=NULL;//初始化为NULL
return node;
}
获取结点高度:
int getheight(NODE* root)
{
if(root==NULL) return 0;//空结点高度为0
return root->height;
}
获取平衡因子:
int getbalancefactor(NODE* root)
{
return getheight(root->lchild)-getheight(root->rchild);
}
更新树高:
void updataheight(NODE* root)
{
root->height=max(getheight(root->lchild),getheight(root->rchild))+1;
}
查找权值为x的结点:
void search(NODE* root,int x)
{
if(root==NULL)
{
printf("Search failed\n");
return ;
}
if(root->v==x)
printf("%d\n",root->v);
else if(root->v>x)
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->rchild;
temp->rchild=root;
updataheight(root);
updataheight(temp);
root=temp;
}
插入操作:
void insert(NODE* &root,int x)//插入
{
if(root==NULL)
{
root=newnode(x);
return ;
}
if(root->v>x)
{
insert(root->lchild,x);
updataheight(root);
if(getbalancefactor(root)==2)
{
if(getbalancefactor(root->lchild)==1)//LL型
R(root);
else if(getbalancefactor(root->rchild)==-1)//LR型
{
L(root->lchild);
R(root);
}
}
}
else
{
insert(root->rchild,x);
updataheight(root);
if(getbalancefactor(root)==-2)
{
if(getbalancefactor(root->rchild)==-1)//RR型
L(root);
else if(getbalancefactor(root->lchild)==1)//RL型
{
R(root->rchild);
L(root);
}
}
}
}
建树(相当于依次插入n个结点):
node* create(int data[],int n)
{
node* root=NULL;//初始化
for(int i=0;i<n;i++)
insert(root,data[i]);
return root;
}