【学习笔记】平衡二叉树(AVL树)简介及其查找、插入、建立操作的实现

 

目录

平衡二叉树简介:

各种操作实现代码:

 

详细内容请参见《算法笔记》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;
}

 

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/Cassie_zkq/article/details/83034186
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞