AVL树
AVL树是一种自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1。因此,插入、查找和删除在平均和最坏情况下的时间复杂度都是O(logn)。
这四个图分别对应AVL树的右旋,左旋,先右再左旋,先左再右旋。
struct node{ int key,height; node *left,*right; }; node a[21]; int t=0; int height(node* n){ if(n==NULL) return 0; return n->height; } node* LL(node* n1){ node* n2=n1->right; n1->right=n2->left; n2->left=n1; n1->height=max(height(n1->left),height(n1->right))+1; n2->height=max(height(n2->left),height(n2->right))+1; return n2; } node* RR(node* n1){ node* n2=n1->left; n1->left=n2->right; n2->right=n1; n1->height=max(height(n1->left),height(n1->right))+1; n2->height=max(height(n2->left),height(n2->right))+1; return n2; } node* LR(node* n){ n->left=LL(n->left); return RR(n); } node* RL(node* n){ n->right=RR(n->right); return LL(n); } node* insert(node* n,int k){ if(n==NULL){ n=&a[t++]; n->left=n->right=NULL; n->height=0; n->key=k; } else if(k<n->key){ n->left=insert(n->left,k); if(height(n->left)-height(n->right)==2){ if(k<n->left->key) n=RR(n); else n=LR(n); } } else{ n->right=insert(n->right,k); if(height(n->right)-height(n->left)==2){ if(k<n->right->key) n=RL(n); else n=LL(n); } } n->height=max(height(n->left),height(n->right))+1; return n; }