C++ -AVL树代码理解

//下面是我手写的AVL树

/*

    @

   @ —–>  LL(我觉的是左偏,分不清楚到底叫法叫什么了)

  @

  @

   @——>  RR

    @

  @

    @—–>  LR

  @

     @

   @ —–>  RL(从最下面开始往上旋转,反正最后将最下面的那个节点移到了最上面

     @

*/

#include <bits/stdc++.h>

using namespace std;

int n;//素组的个数

int a[100];

typedef struct NODE

{

    NODE*left;

    NODE*right;

    int val;

    int height;

    int getHeight()//这个地方是需要节点的高度的,因为要计算bf平衡因子

    {

        if(this==NULL)

        {

            return 0;

        }

        else

        {

            return this->height=max(this->left->getHeight(),this->right->getHeight())+1;

        }

    }

    NODE(int value)//构造函数

    {

        left=NULL;

        right=NULL;

        val=value;

        height=0;

    }

}node;

//我看过网上的别人的代码,大致有两种写法,一种是返回指针的形式,

//另一种是指针的引用,指针的引用我搞不清楚,不知道最后那个父指针是怎么连上去的

//所以采用返回指针的形式

node*LL(node*root)

{//这个地方旋转之后其实,root的值已经变了,

    node*temp=root->left;//这个地方理解就很好写了

    root->left=temp->right;

    temp->right=root;

    return temp;

}

//RR其实和LL刚好相反

node*RR(node*root)

{

    node*temp=root->right;

    root->right=temp->left;

    temp->left=root;

    return temp;

}//对称的,left变right,right变left

node*Insert(node*root,int value)

{

    if(root==NULL)

    {//这样写,就不用先插入一个节点,一次性处理所有的节点

        root=new node(value);//最下面有染回root

    }

    else

    {

        if(value<root->val)

        {

            root->left=Insert(root->left,value);//传进去谁的值,就返回谁的值

            if(root->left->getHeight()-root->right->getHeight()==2)

            {//这个地方得自己意会了

                if(value<root->left->val)

                {

                    root=LL(root);

                }

                else

                {

                    root->left=RR(root->left);//两个地方平移的位置也不一样

                    root=LL(root);//与之前那个是烦的

                }

            }

        }

        else

        {

            root->right=Insert(root->right,value);

            if(root->right->getHeight()-root->left->getHeight()==2)

            {

                if(value>root->right->val)

                {

                    root=RR(root);

                }

                else

                {

                    root->right=LL(root->right);

                    root=RR(root);

                }

            }

        }

    }

    return root;//这里写返回root;

}

void inOrder(node*root)

{

    if(root==NULL)

    {

        return;

    }

    else

    {

        inOrder(root->left);

        cout <<root->val<<” “;

        inOrder(root->right);

    }

}

void levelOrder(node*root)

{

    queue<node*>que;

    que.push(root);

    int temp;

    node*p=NULL;

    while(!que.empty())

    {

        p=que.front();

        que.pop();

        cout <<p->val<<” “;

        if(p->left!=NULL)

        {

            que.push(p->left);

        }

        if(p->right!=NULL)

        {

            que.push(p->right);

        }

    }

}

int main(void)

{

    cin>>n;

    NODE*root=NULL;

    for(int i=0;i<n;++i)

    {

        cin>>a[i];

        root=Insert(root,a[i]);

    }

  // inOrder(root);

    levelOrder(root);

    return 0;

}

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