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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值