AVL树C++模板类实现
来源:互联网 发布:php源码大全 编辑:程序博客网 时间:2024/06/18 09:04
注意模板类,声明和定义在同一个文件里Tree.h
/***********avl**********////Tree.h// #ifndef AVL_BLOCK#define AVL_BLOCKtemplate<typename T>class Treenode{ public:T val;int height;int freq;Treenode*lson;Treenode*rson;Treenode(int h=0):lson(NULL),rson(NULL),height(h),freq(1){}};//节点的声明//下面是AVL类的声明template<typename T>class AVLtree{ private:Treenode<T>*root;void insert(Treenode<T>*&r,T x);Treenode<T>*find(Treenode<T>*r,T x);void deletenode(Treenode<T>*&r,T x);void inorder(Treenode<T>*r);int get_height(Treenode<T>*r);void singleRotaLeft(Treenode<T>*&r);void singleRotaRight(Treenode<T>*&r);void DoubleRotaLeft(Treenode<T>*&r);void DoubleRotaRight(Treenode<T>*&r);void destroy(Treenode<T>*&r); public:AVLtree():root(NULL){}int Get_height();//求高度的接口void Insert(T x);//插入接口Treenode<T>*find(T x);//查找接口void Delete(T x);//删除接口void travel();//遍历接口void Destroy();//};//AVL的定义,带模板的必须与声明在同一个文件//************AVL*******************//template<typename T>int AVLtree<T>::get_height(Treenode<T>*r){if(r){return r->height;}return -1;}template<typename T>int AVLtree<T>::Get_height(){return get_height(root);}template<typename T>void AVLtree<T>::singleRotaLeft(Treenode<T>*&r){Treenode<T>*n=r->lson;r->lson=n->rson;n->rson=r;r->height=max(get_height(r->lson),get_height(r->rson))+1;n->height=max(get_height(n->lson),r->height)+1;r=n;}template<typename T>void AVLtree<T>::singleRotaRight(Treenode<T>*&r){Treenode<T>*n=r->rson;r->rson=n->lson;n->lson=r;r->height=max(get_height(r->lson),get_height(r->rson))+1;n->height=max(get_height(n->lson),r->height)+1;r=n;}template<typename T>void AVLtree<T>::DoubleRotaLeft(Treenode<T>*&r){singleRotaRight(r->lson);singleRotaLeft(r);}template<typename T>void AVLtree<T>::DoubleRotaRight(Treenode<T>*&r){singleRotaLeft(r->rson);singleRotaRight(r);}template<typename T>void AVLtree<T>::insert(Treenode<T>*&r,T x){if(r==NULL){r=new Treenode<T>();r->val=x;return;}if(r->val>x){ insert(r->lson,x); if(get_height(r->lson)-get_height(r->rson)==2) {if(x<r->lson->val)singleRotaLeft(r);else DoubleRotaLeft(r); } }//左子树else if(r->val<x){ insert(r->rson,x); if(get_height(r->rson)-get_height(r->lson)==2) {if(x>r->rson->val)singleRotaRight(r);else DoubleRotaRight(r); } }//右子树else ++(r->freq);r->height=max(get_height(r->lson),get_height(r->rson))+1;}template<typename T>void AVLtree<T>::Insert(T x){insert(root,x);}template<typename T>Treenode<T>*AVLtree<T>::find(Treenode<T>*r,T x){if(r==NULL)return NULL;if(r->val>x)return find(r->lson,x);else if(r->val<x)return find(r->rson,x);else return r;}template<typename T>Treenode<T>* AVLtree<T>::find(T x){return find(root,x);}template<typename T>void AVLtree<T>::deletenode(Treenode<T>*&r,T x){if(r==NULL)return;if(x<r->val){ deletenode(r->lson,x); if(get_height(r->rson)-get_height(r->lson)==2) {if(r->rson->lson&&get_height(r->rson->lson)>get_height(r->rson->rson))DoubleRotaRight(r);else singleRotaRight(r); } }else if(x>r->val){ deletenode(r->rson,x); if(get_height(r->lson)-get_height(r->rson)==2) { if(r->lson->rson&&get_height(r->lson->rson)>get_height(r->lson->lson))DoubleRotaLeft(r); else singleRotaLeft(r); } }else{ Treenode<T>*tmp=NULL; if(r->lson&&r->rson){tmp=r->rson;while(tmp->lson){tmp=tmp->lson;}r->val=tmp->val;r->freq=tmp->freq;deletenode(r->rson,tmp->val);if(get_height(r->lson)-get_height(r->rson)==2){ if(r->lson->rson&&get_height(r->lson->rson)>get_height(r->lson->lson))DoubleRotaLeft(r); else singleRotaLeft(r); } } else if(r->lson==NULL&&r->rson==NULL){delete(r);r=NULL;//避免指针成为空悬指针 } else{tmp=r;if(r->lson==NULL)r=r->rson;else r=r->lson;delete(tmp);tmp=NULL; } }if(r==NULL)return;r->height=max(get_height(r->lson),get_height(r->rson))+1;}template<typename T>void AVLtree<T>::Delete(T x){deletenode(root,x);}template<typename T>void AVLtree<T>::inorder(Treenode<T>*r){ if(r==NULL)return;inorder(r->lson);cout<<r->val<<" ";inorder(r->rson);}template<typename T>void AVLtree<T>::travel(){inorder(root);}template<typename T>void AVLtree<T>::destroy(Treenode<T>*&r){if(r==NULL)return;destroy(r->lson);destroy(r->rson);free(r);}template<typename T>void AVLtree<T>::Destroy(){destroy(root);}#endif//AVL测试程序:
include<iostream>#include<stdlib.h>#include<string.h>#include"Tree.h"//main.cpp static int arr[]={3,2,1,4,5,6,7,16,15,14,13,12,11,10,8,9};using namespace std;int main(){int i;AVLtree<int>*tree=new AVLtree<int>();int len=sizeof(arr)/sizeof(int);cout<<"依次添加:"<<endl;for(i=0;i<len;i++){cout<<arr[i]<<" ";tree->Insert(arr[i]);}cout<<"中序遍历:"<<endl;tree->travel();i=8;cout<<"删除节点i=8"<<endl;tree->Delete(i);cout<<"删除之后中序遍历"<<endl;tree->travel();tree->Destroy();cout<<endl;}
0 0
- AVL树的C++模板类实现
- AVL树C++模板类实现
- AVL树的模板实现
- AVL树的模板实现
- AVL树C实现
- AVL树C实现
- AVL树C实现
- AVL树-C实现
- avl树 C实现
- AVL类模板C++(持续更新)
- AVL树C语言实现
- AVL树 C语言实现
- C 数据结构 AVL树实现
- AVL树(c实现)
- AVL树C语言实现
- avl树的c实现
- AVL树--C语言实现
- AVL树--C语言实现
- 进程学习:3-进程组、会话、守护进程
- 【转】Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解
- Mac下搭建hadoop伪分布式及eclipse开发环境
- Java 反射机制分析指南
- RPM方式安装MySQL5.6
- AVL树C++模板类实现
- ScrollView快速滑动或拖拽停止事件监听
- 第十一周OJ——牛顿迭代法求根
- php上传文件中文文件名乱码的解决方法
- bias 和 variance 的推导
- Linux命令-挂载命令mount
- 防卫式声明
- uoj52逃跑(最短路)
- HTTP协议小知识