avl树

今天看了下avl树,随手写了一个,没写删除,删除的精髓是把本来要删的一个有2个孩子的点,变成删除它的前驱或者后继,在递归维护平衡

#include <iostream>
#include <bits/stdc++.h>
#define ll node[root].l
#define rr node[root].r
using namespace std;
const int maxn  = 1e2;
struct Node{
   int l,r;
   int val;
   int height;
}node[maxn];
int tot = 0;
int newnode(int val){
    node[tot].l = -1;
    node[tot].r = -1;
    node[tot].height = 1;
    node[tot].val = val;
    return tot++;
}
int geth(int t){
    if(t==-1) return 0;
    else return node[t].height;
}
int updateh(int root){
    node[root].height = max(geth(ll),geth(rr))+1;
}
int lrotation(int root){
    int rson = node[root].r;
    int rsonlson = node[rson].l;
    node[rson].l = root;
    node[root].r = rsonlson;
    updateh(root);
    updateh(rson);
    return rson;
}
int rrotation(int root){
    int lson = node[root].l;
    int lsonrson = node[lson].r;
    node[lson].r = root;
    node[root].l = lsonrson;
    updateh(root);
    updateh(lson);
    return lson;
}
int lrrotation(int root){
    node[root].l = lrotation(ll);
    return rrotation(root);
}
int rlrotation(int root){
    node[root].r = rrotation(rr);
    return lrotation(root);
}
int inser(int root,int val){
    if(root==-1){
        return newnode(val);
    }else if(val<node[root].val){
        node[root].l = inser(node[root].l,val);
        int t = geth(ll)-geth(rr);
        if(t==2){
            if(val<node[ll].val){
                root = rrotation(root);
            }else{
                root = lrrotation(root);
            }
        }
    }else{
        node[root].r = inser(node[root].r,val);
        int t = geth(rr)-geth(ll);
        if(t==2){
            if(val>node[rr].val){
                root = lrotation(root);
            }else{
                root = rlrotation(root);
            }
        }
    }
    node[root].height = max(geth(ll),geth(rr))+1;
    return root;
}
void pp(int root){
    if(root==-1) return;
    pp(ll);
    printf(" %d ",node[root].val);
    pp(rr);
}
int main()
{
    int root = -1;
    for(int i=0;i<10;i++){
        root = inser(root,i);
    }
    pp(root);
    return 0;
}

 

posted @ 2018-05-06 19:15  tjucxz  阅读(120)  评论(0编辑  收藏  举报