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; }