二叉平衡树的实现,AVL平衡树的实现与分析及测试

来源:互联网 发布:知达常青藤中学校官网 编辑:程序博客网 时间:2024/06/05 17:01

希望代码是自解释的,已经过测试,代码复制粘贴即可运行。

头文件如下:


/* *此算法用来排序的话,很慢,和快速排序和堆排序无法比拟额 * * * */// http://blog.csdn.net/whucyl/article/details/17289841 理论详细// http://www.enjoydiy.com/91.html示例详细// http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html 讲解详细(代码参考-递归版本)// http://www.cnblogs.com/abatei/archive/2008/11/17/1335031.html AVL最详细讲解(代码参考-非递归版本)#ifndef AVL_H#define AVL_H#include "Common.h"// 递归版本template<typename T>class TreeNode{public:TreeNode():lson(NULL),rson(NULL),freq(1),hgt(0){ }T data;int hgt;unsigned int freq;TreeNode *lson;TreeNode *rson;};template<typename T>class AVLTree{private:TreeNode<T> *root;TreeNode<T> *insertpri( TreeNode<T> *&node, T x );TreeNode<T> *findpri( TreeNode<T> *node, T x );void preOrder( TreeNode<T> *node ); //前序遍历void inOrder( TreeNode<T> *node );// 中序遍历void postOrder( TreeNode<T> *node );// 后序遍历void Deletepri( TreeNode<T> * &node, T x );int height( TreeNode<T> *node );TreeNode<T> * SingRotateLeft( TreeNode<T> * &k2);TreeNode<T> * SingRotateRight(TreeNode<T> * &k2);TreeNode<T> * DoubleRotateLR( TreeNode<T> * &k3);TreeNode<T> * DoubleRotateRL( TreeNode<T> * &k3);int Max( int cmpa, int cmpb );public:AVLTree():root(NULL){}void insert( T x );TreeNode<T>*  find( T x );void Delete( T x );void preOrderTraversal();void inOrderTraversal();void postOrderTraversal();};// 非递归版本//测试代码void AVLCppTest();#endif

以下是CPP文件:


#include "AVL.h"// 递归版本template<typename T>TreeNode<T> * AVLTree<T>::SingRotateLeft( TreeNode<T> * &childRoot)// 注意:这里是对指针的引用,说明这里是要改变指针的值,不是指向的值{TreeNode<T> *k1;k1 = childRoot->lson;childRoot->lson = k1->rson;k1->rson = childRoot;childRoot->hgt = Max( height(childRoot->lson ), height(childRoot->rson) ) +1;k1->hgt = Max( height(k1->lson ), childRoot->hgt)+1;return  k1;// 这里应该返回一个指向旋转后子树根的指针,因为在这个函数返回后,这个指针已经丢失了}template<typename T>TreeNode<T> * AVLTree<T>::SingRotateRight( TreeNode<T> * &childRoot){TreeNode<T> *k1;k1 = childRoot->rson;childRoot->rson = k1->lson;k1->lson = childRoot;childRoot->hgt = Max(height(childRoot->lson), height(childRoot->rson) ) +1 ;k1->hgt = Max(height(k1->rson), childRoot->hgt) + 1;return  k1;}template<typename T>TreeNode<T> * AVLTree<T>::DoubleRotateLR( TreeNode<T> * & childRoot ){TreeNode<T> *k1 = NULL;childRoot->lson = SingRotateRight(childRoot->lson);k1 = SingRotateLeft(childRoot);return  k1;}template<typename T>TreeNode<T> * AVLTree<T>::DoubleRotateRL( TreeNode<T> *&childRoot){TreeNode<T> *k1 = NULL;childRoot->rson = SingRotateLeft(childRoot->rson);k1 = SingRotateRight(childRoot);return  k1;}template<typename T>TreeNode<T> * AVLTree<T>::insertpri( TreeNode<T> *&node, T x ){TreeNode<T> *childRootAfter = NULL;if( node == NULL ){node = new TreeNode<T>();node->data = x;node->hgt = 0;node->lson = node->rson = NULL;}if( node->data > x ){node->lson = insertpri(node->lson, x);if( 2 == height(node->lson) - height(node->rson) ) //实际上,在此得到的是平衡因子BF,30 20 15,此时节点是30,得到左边高度1减去右边-1应该是2{cout<<" BF = "<<node->data<<endl;//inOrderTraversal();if( height(node->lson->lson) > height(node->lson->rson) ){childRootAfter = SingRotateLeft(node);}else{childRootAfter = DoubleRotateLR(node);}node->hgt = Max(height(node->lson),height(node->rson))+1;return childRootAfter;//调整当前子树的父节点的指针指向,旋转过后的子树的根}}else if( node->data < x ){node->rson = insertpri( node->rson, x );if( 2 == (height(node->rson) - height(node->lson ))){if( x > node->rson->data ){childRootAfter = SingRotateRight(node);}else{childRootAfter = DoubleRotateRL(node);}node->hgt = Max(height(node->lson),height(node->rson))+1;return childRootAfter;//调整当前子树的父节点的指针指向,旋转过后的子树的根}}else ++(node->freq);node->hgt = Max(height(node->lson),height(node->rson))+1;return node;}template<typename T>TreeNode<T> *AVLTree<T>::findpri( TreeNode<T> *node, T x ){if( node == NULL )return NULL;if( noe->data > x )return findpri(node->lson, x );else if( node->data < x )return findpri( node->rson, x );else return node;}template<typename T>void AVLTree<T>::preOrder( TreeNode<T> * node ) // 前序序遍历{if( node == NULL ) return;cout<<node->data/*<<" :"<<node->hgt*/<<" ";preOrder( node->lson );preOrder( node->rson );}template<typename T>void AVLTree<T>::inOrder( TreeNode<T> * node ) // 中序遍历{if( node == NULL ) return;inOrder( node->lson );cout<<node->data/*<<" :"<<node->hgt*/<<" ";inOrder( node->rson );}template<typename T>void AVLTree<T>::postOrder( TreeNode<T> * node ) // 后序遍历{if( node == NULL ) return;postOrder( node->lson );postOrder( node->rson );cout<<node->data/*<<" :"<<node->hgt*/<<" ";}template<typename T>void AVLTree<T>::insert( T x ){root = insertpri(root,x); // 由于根节点可能改变,所以需要根据子树返回的指针更新当前root的值}template<typename T>void AVLTree<T>::preOrderTraversal(){cout<<"前序遍历";preOrder(root);cout<<endl;}template<typename T>void AVLTree<T>::inOrderTraversal(){cout<<"中序遍历: ";inOrder(root);cout<<endl;}template<typename T>void AVLTree<T>::postOrderTraversal(){cout<<"后续遍历: ";postOrder(root);cout<<endl;}template<typename T>int AVLTree<T>::height(TreeNode<T> * node ){if(node != NULL ){//cout<<"NOT NULL"<<endl;return node->hgt;}return -1;}template<typename T>int AVLTree<T>::Max( int cmpa, int cmpb ){return cmpa > cmpb ? cmpa:cmpb;}template<typename T>void AVLTree<T>::Deletepri( TreeNode<T> * &node, T x ){if( node == NULL ) return;if( x < node->data ){Deletepri(node->lson, x );if( 2 == height( node->rson) - height(node->lson ) )if( node->rson->lson != NULL && ( height(node->rson->lson) > height(node->rson->rson) ) )DoubleRotateRL(node);elseSingRotateRight(node);}else if( x > node->data ){Deletepri( node->rson, x );if( 2 == height(node->lson) - height(node->rson) )if( node->lson->rson != NULL && ( height(node->lson->rson) > height( node->lson->rson) ) )DoubleRotateLR(node);elseSingRotateLeft(node);}else{if( node->lson && node->rson ){TreeNode<T> *temp = node->rson;while( temp->lson != NULL ) temp = temp->lson;node->data = temp->data;node->freq = temp->freq;Deletepri(node->rson,temp->data);if( 2 == height( node->lson) - height(node->rson) ){if( node->lson->rson != NULL && ( height(node->lson->rson) > height(node->lson->lson) ) )DoubleRotateLR(node);elseSingRotateLeft(node);}}else{TreeNode<T> * temp = node;if( node->lson == NULL )node = node->rson;else if( node->rson = NULL )node = node->lson;delete(temp);temp = NULL;}}if( node == NULL ) return;node->hgt = Max(height(node->lson), height(node->rson) )+ 1;return;}template<typename T>void AVLTree<T>::Delete(T x){Deletepri(root, x);}// 非递归版本//测试代码void AVLCppTest(){clock_t tBegin,tEnd;// 递归版本的测试AVLTree<int> avlTree;/*avlTree.insert(35);avlTree.insert(40);avlTree.insert(45);avlTree.insert(20);avlTree.insert(15);avlTree.insert(11);avlTree.insert(10);avlTree.insert(12);avlTree.insert(11);avlTree.insert(40);avlTree.insert(11);avlTree.insert(25);avlTree.insert(25);avlTree.insert(25);*/tBegin = clock();for( int i = 0; i < 1000; i++ ){avlTree.insert(rand()%999 );}tEnd = clock();cout<<"The run time of AVL is : "<<tEnd-tBegin<<"  ms"<<endl;//avlTree.preOrderTraversal();avlTree.inOrderTraversal();//avlTree.postOrderTraversal();return;// 非递归版本的测试//return;}


0 0
原创粉丝点击