标签:
#include<iostream> #include <stack> using namespace std; template<class T> class AVLTree; template <class T> class AVLNode { friend class AVLTree<T>; public: AVLNode():leftChild(NULL),rightChild(NULL),bf(0) {} AVLNode(T t,AVLNode<T>* l=NULL, AVLNode<T>* r=NULL):data(t),leftChild(l),rightChild(r),bf(0) {} ~AVLNode() {} private: AVLNode<T>* leftChild; AVLNode<T>* rightChild; T data; int bf; //平衡因子 }; template<class T> class AVLTree { public: AVLTree():root(NULL) {} AVLTree(T Ref):Refvalue(Ref),root(NULL) {} ~AVLTree() {} bool Insert( T &x) { return Insert(root,x); } void PrintAVLTree() { PrintAVLTree(root); } void PrintTree() { PrintTree(root); } void Print() { Print(root); } bool Remove(const T x) { return Remove(root,x); } protected: bool Remove(AVLNode<T>* &t,const T x) { AVLNode<T> *parent=NULL, *q , *ppr,*p = t; stack<AVLNode<T> *> st; int d,dd=0; while(p != NULL) { if(x == p->data) break; parent = p; st.push(parent); if(x < p->data) p = p->leftChild; else p = p->rightChild; } if(p == NULL) return false; if(p->leftChild != NULL && p->rightChild != NULL) //被删节点有两个子女 { parent = p; st.push(parent); q = p->leftChild; while(q->rightChild != NULL) { parent = q; st.push(parent); q = q->rightChild; } p->data = q->data; p = q; //被删节点转化为q } if(p->leftChild != NULL) q = p->leftChild; else q = p->rightChild; if(parent == NULL) t = q; else { if(parent->leftChild == p) parent->leftChild = q; else parent->rightChild = q; while(!st.empty()) { //parent = st.top(); // st.pop(); if(parent->rightChild == q) parent->bf --; // else parent->bf ++;// if(!st.empty()) { ppr = st.top(); //祖父节点 dd = (ppr->leftChild == parent) ? -1 : 1; } else dd=0; if(parent->bf == 1 || parent->bf == -1) break; if(parent->bf != 0) { if(parent->bf < 0) { d = -1; q = parent->leftChild; } else { d = 1; q = parent->rightChild; } if(q->bf == 0) { if(d == -1) { RotateR(parent); parent->bf = 1; parent->leftChild->bf = -1; } else { RotateL(parent); parent->bf = -1; parent->rightChild->bf =1; } break; } if(q->bf == d) { if(d == -1) RotateR(parent); else RotateL(parent); } else { if(d == -1) RotateLR(parent); else RotateRL(parent); } if(dd == -1) ppr->leftChild = parent; else if(dd == 1) ppr->rightChild = parent; } q = parent; } if(st.empty()) t = parent; } delete p; return true; } void PrintAVLTree(AVLNode<T>* &t)//中序遍历 { if(t != NULL) { PrintAVLTree(t->leftChild); cout<<t->data<<" "; PrintAVLTree(t->rightChild); } } void PrintTree(AVLNode<T> *& t) //后序 { if(t != NULL) { PrintTree(t->rightChild); cout<<t->data<<" "; PrintTree(t->leftChild); } } void Print(AVLNode<T> *& t) //前序 { if(t != NULL) { cout<<t->data<<" "; Print(t->leftChild); Print(t->rightChild); } } bool Insert(AVLNode<T> * &t, T &x) { AVLNode<T> *pr = NULL, *p = t, *q; int d; stack<AVLNode<T> *> st; while(p != NULL) //寻找插入位置 { if(x == p->data) return false; pr = p; st.push(pr); if(x < p->data) p = p->leftChild; else p = p->rightChild; } p = new AVLNode<T>(x); //创建新节点,data=x,bf=0 if(p == NULL) { cerr<<"存储空间不足"<<endl; exit(1); } if(pr == NULL) //空树,新节点成为根节点 { t = p; return true; } if(x < pr->data) pr->leftChild = p; //新节点插入 else pr->rightChild = p; while(!st.empty()) { pr = st.top(); st.pop(); if(p == pr->leftChild) pr->bf --; else pr->bf ++; if(pr->bf == 0) break; //平衡退出 if(pr->bf == 1 || pr->bf == -1) p = pr; else //|bf|==2 { d = (pr->bf < 0) ? -1 : 1; //区别单双旋转标志 if(p->bf == d) //两节点平衡因子同号,单旋转 { if(d == -1) RotateR(pr); else RotateL(pr); } else { if(d == -1) RotateLR(pr); else RotateRL(pr); } break; //不再向上调整 } } if(st.empty()) t = pr; else { q = st.top(); if(q->data > pr->data) q->leftChild = pr; else q->rightChild = pr; } return true; } void RotateL(AVLNode<T>* &ptr) //左旋转 { AVLNode<T> *subL = ptr; //要旋转的节点 ptr = subL->rightChild; subL->rightChild = ptr->leftChild; //ptr成为新根前卸掉左边负载 ptr->leftChild = subL; //左单旋转,ptr为新根 ptr->bf = subL->bf = 0; } void RotateR(AVLNode<T>* &ptr) //右旋转 { AVLNode<T> *subR = ptr; ptr = subR->leftChild; subR->leftChild = ptr->rightChild; //先卸掉右边负载 ptr->rightChild = subR; ptr->bf = subR->bf = 0; } void RotateLR(AVLNode<T>* &ptr) //先左后右双旋转 { AVLNode<T> *subR = ptr, *subL = subR->leftChild; ptr = subL->rightChild; subL->rightChild = ptr->leftChild; ptr->leftChild = subL; if(ptr->bf <= 0) subL->bf = 0; //插入新节点后ptr左子树变高 else subL->bf = -1; subR->leftChild = ptr->rightChild; //甩掉ptr右边的负载 ptr->rightChild = subR; if(ptr->bf == -1) subR->bf = 1; else subR->bf = 0; ptr->bf = 0; } void RotateRL(AVLNode<T> * &ptr) { AVLNode<T> *subL = ptr,*subR = subL->rightChild; ptr = subR->leftChild; subR->leftChild = ptr->rightChild; //先卸掉负载 ptr->rightChild = subR; if(ptr->bf >= 0) subR->bf = 0; else subR->bf = 1; subL->rightChild = ptr->leftChild; ptr->leftChild = subL; if(ptr->bf == 1) subL->bf = -1; else subL->bf = 0; ptr->bf = 0; } private: AVLNode<T> *root; T Refvalue; //结束标志 }; void main() { int a[] = {9,53,5,45,17,23,78,65,34,87}; AVLTree<int> avl; for(int i=0; i<10; ++i) avl.Insert(a[i]); avl.PrintAVLTree(); cout<<endl; // avl.PrintTree(); // cout<<endl; // avl.Print(); // cout<<endl; avl.Remove(45); avl.PrintAVLTree(); cout<<endl; }
标签:
原文地址:http://blog.csdn.net/lc331257229/article/details/46044891