AVL树非递归实现插入和删除例程

来源:互联网 发布:c语言32个关键字 编辑:程序博客网 时间:2024/05/16 10:22

原理:用一个栈把插入和删除时搜索路径记录下来,按照一般二叉树执行了插入,删除操作后再原路返回,修改高度信息和进行旋转操作使满足AVL平衡条件。

 

//AVL树模板(部分)#ifndef AVLTree_h#define AVLTree_h#include <iostream>#include <stack>  //记录删除时遍历路径template<typename Comparable>class AVLTree{private:    struct AvlNode //树结点的定义{    Comparable element;AvlNode *left;AvlNode *right;int height;AvlNode(const Comparable &theElement,AvlNode *lt=NULL,AvlNode *rt=NULL,int h=0):element(theElement),left(lt),right(rt),height(h){}};         AvlNode *root; //根节点的声明inline int max(int a,int b)  //计算两整数最大值,在算树高度时总是用到{if(a>b)return a;else return b;}inline int height(AvlNode *t)const  //计算高度          {return NULL==t ? -1 :t->height;}void adjust(AvlNode *&t)  //调整使符合AVL条件{                  if(height(t->left)-height(t->right)==2)if(height(t->left->right)<height(t->left->left))rotateWithLeftChild(t);else doubleWithLeftChild(t);else if(height(t->right)-height(t->left)==2)if(height(t->right->left)<height(t->right->right))rotateWithRightChild(t);else doubleWithRightChild(t);}bool insert(const Comparable &x,AvlNode *&t) //插入元素,非递归{stack<AvlNode**> searchp;AvlNode **iter=&t;while((*iter)!=NULL){searchp.push(iter);if(x<(*iter)->element) iter=&(*iter)->left;else if((*iter)->element<x) iter=&(*iter)->right;else return false;  //重复}*iter=new AvlNode(x);while(!searchp.empty())  //开始回溯{AvlNode** backp=searchp.top();searchp.pop();(*backp)->height=max(height((*backp)->left),height((*backp)->right))+1;adjust(*backp);}return true;}bool remove(const Comparable &x,AvlNode *&t)  //移除元素,非递归{    stack<AvlNode**> searchp;AvlNode **iter=&t;while(*iter!=NULL){searchp.push(iter);if(x<(*iter)->element) iter=&((*iter)->left);else if((*iter)->element<x) iter=&((*iter)->right);else{if((*iter)->left!=NULL&&(*iter)->right!=NULL) //Two child{AvlNode **oldit=iter;iter=&((*iter)->right);searchp.push(iter);while((*iter)->left!=NULL){iter=&((*iter)->left);  //查找要删除的结点按中序遍历后一个结点searchp.push(iter);}(*oldit)->element=(*iter)->element;}*iter=((*iter)->left!=NULL)?(*iter)->left:(*iter)->right;delete *(searchp.top());searchp.pop();while(!searchp.empty())  //开始回溯{AvlNode** backp=searchp.top();searchp.pop();(*backp)->height=max(height((*backp)->left),height((*backp)->right))+1;adjust(*backp);}return true;}}return false;}void rotateWithRightChild(AvlNode *& k1) //单旋转{AvlNode *k2=k1->right;k1->right=k2->left;k2->left=k1;k1->height=max(height(k1->left),height(k1->right))+1;k2->height=max(height(k2->right),k1->height)+1;k1=k2;}void rotateWithLeftChild(AvlNode *& k2)  //单旋转II{AvlNode *k1=k2->left;k2->left=k1->right;k1->right=k2;k2->height=max(height(k2->left),height(k2->right))+1;k1->height=max(height(k2->left),k2->height)+1;k2=k1;}void doubleWithLeftChild(AvlNode *& k3)  //双旋转{rotateWithRightChild(k3->left);rotateWithLeftChild(k3);}void doubleWithRightChild(AvlNode *& k4)  //双旋转II{rotateWithLeftChild(k4->left);rotateWithRightChild(k4);}//…………}


原创粉丝点击