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);}//…………}
- AVL树非递归实现插入和删除例程
- AVL树插入例程非递归实现C语言
- AVL平衡树插入非递归实现 C语言
- AVL树的插入与删除(均为递归实现)
- AVL树实现(插入删除)
- 查找二叉树的实现(查找,删除,插入)分别用递归和非递归
- AVL树实现非懒惰删除
- 向AVL树进行插入的非递归函数
- AVL树进行插入的非递归函数
- C语言 AVL树的 非递归 方法插入
- AVL树插入和删除源代码
- AVL树的插入和删除
- AVL 树的插入和删除
- AVL树的插入和删除
- 二分查找的非递归和递归例程实现
- AVL树插入删除
- 数据结构与算法分析学习笔记--第四章(搜索二叉树,递归和非递归实现删除、插入)
- AVL树C++实现以及(递归函数)非递归改进
- 转:chm无法显示解决办法
- linux下的spi调试.
- 最大子矩阵之和
- 秋忆
- 读书法---态度至上
- AVL树非递归实现插入和删除例程
- 字节排序问题
- linux/mm/memory.c/try_to_share()
- 整合Spring和JPA
- 有谁碰到过这类问题没??? eclipse 连接hbase
- 分数运算窗口(下拉式)
- IPhone之ASIFormDataRequest POST操作架构设计
- C盘不能新建文件,提示客户端没有特权
- one more time, one more chance