AVL树的删除操作如何实现

RabbitLBJ 2013-03-11 09:41:11
看了几本数据结构的书,上面都没有将AVL树的删除操作是如何实现的?哪位高人能讲讲过程,如果能提供参考代码就更好了,谢谢
...全文
328 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tjweilong 2013-03-11
  • 打赏
  • 举报
回复
全部代码 可以看我空间里上传的资源
tjweilong 2013-03-11
  • 打赏
  • 举报
回复
template<class T> AvlTree<T>& AvlTree<T>:: Delete(const T x) { AvlNode<T>* Temp=NULL;//被删除节点的父节点 int Direction= -1; //如果删除元素为其父的左孩子,则OnlyDelete函数将其设置为0,否则设置为1。该参数第一次右OnlyDelete函数设置,后续右本函数来设置 cout<<"删除元素:"<<x<<endl; OnlyDelete(x,&Temp,Direction); if(!Root) { cout<<"树已经空了,不需要再调整"<<endl; return *this; } if(!Temp) { PRINT_ERROR_MSG("没有找到要删除的元素"); } //运行到这里,Temp即为被删除元素的父节点,从Temp开始向根节点方向进行调整。 int AdjustFlag = 1;//调整标志,如果是0,不调整,如果为1,则进行调整; while(Temp) { if(AdjustFlag == 0) { cout<<"不再需要调整"<<endl; break; } if(Direction == 0) { Temp->Balance -=1; switch(Temp->Balance) { case 0: AdjustFlag = 1; break; case 1: PRINT_ERROR_MSG("删除左子树上节点,删除之后平衡因子为1,这种情况是不存在的"); break; case 2: PRINT_ERROR_MSG("删除左子树上节点,删除之后平衡因子为2,这种情况是不存在的"); break; case -1: cout<<"删除左子树节点,并且删除之后,因子为-1,此时不需要调整"<<endl; AdjustFlag = 0; break; case -2: cout<<"删除左子树节点,并且删除之后,因子为-2,此时需要调整,根据其右边第一个子节点情况来进行调整"<<endl; L_Rotate(Temp,AdjustFlag); break; } } if(Direction == 1) { Temp->Balance += 1; switch(Temp->Balance) { case 0: AdjustFlag = 1; break; case 1: cout<<"这种情况下,不需要调整"<<endl; AdjustFlag = 0; break; case -1: PRINT_ERROR_MSG("这种情况是不存在的:删除右子树节点之后,balance=-1"); AdjustFlag = 0; break; case 2: cout<<"需要调整"<<endl; R_Rotate(Temp->Parent,AdjustFlag); } } if(Temp->Parent) { if(Temp==Temp->Parent->Left) { Direction = 0; } if(Temp == Temp->Parent->Right) { Direction = 1; } } Temp = Temp->Parent; } return *this; }

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧