平衡二叉树(AVL树)的简单实现

《平衡二叉树(AVL树)的简单实现》

《平衡二叉树(AVL树)的简单实现》#include 

<
stdlib.h
>

《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》template

<
typename T
>

《平衡二叉树(AVL树)的简单实现》

class
 CAVLTree;
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》template

<
typename T
>

《平衡二叉树(AVL树)的简单实现》

class
 CAVLTreeNode
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》

《平衡二叉树(AVL树)的简单实现》
{
《平衡二叉树(AVL树)的简单实现》
public:
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode(
const T& item,CAVLTreeNode<T>* lptr = NULL,CAVLTreeNode<T>* rptr = NULL,int balfac=0):data(item),left(lptr),right(rptr),balanceFactor(balfac)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T>* Left(void)const
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        
return left;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T>* Right(void)const
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        
return right;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
int GetBalanceFactor()const
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        
return this->balanceFactor;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    friend 
class CAVLTree<T>;
《平衡二叉树(AVL树)的简单实现》
public:
《平衡二叉树(AVL树)的简单实现》    T data;
//数据
《平衡二叉树(AVL树)的简单实现》
private:
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T>* left;//左子树
《平衡二叉树(AVL树)的简单实现》
    CAVLTreeNode<T>* right;//右子树
《平衡二叉树(AVL树)的简单实现》
    int balanceFactor;//平衡因子
《平衡二叉树(AVL树)的简单实现》
    CAVLTreeNode<T>* & Left(void)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        
return left;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T>* & Right(void)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        
return right;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》}

;
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》

const
 
int
 LEFTHEAVY 
=
 

1
;
《平衡二叉树(AVL树)的简单实现》

const
 
int
 BALANCE 
=
 
0
;
《平衡二叉树(AVL树)的简单实现》

const
 
int
 RIGHTHEAVY 
=
 
1
;
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》template

<
typename T
>

《平衡二叉树(AVL树)的简单实现》

class
 CAVLTree
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》

《平衡二叉树(AVL树)的简单实现》
{
《平衡二叉树(AVL树)的简单实现》
public:
《平衡二叉树(AVL树)的简单实现》    CAVLTree(
void);
《平衡二叉树(AVL树)的简单实现》    CAVLTree(
const CAVLTree<T>& tree);
《平衡二叉树(AVL树)的简单实现》    CAVLTree
& operator = (const CAVLTree& rhs);
《平衡二叉树(AVL树)的简单实现》    
void Insert(const T& item);
《平衡二叉树(AVL树)的简单实现》    
void ClearTree();//清空树
《平衡二叉树(AVL树)的简单实现》
    bool Contains(const T& item);//是否包含数据
《平衡二叉树(AVL树)的简单实现》
    CAVLTreeNode<T>* FindNode(const T& item,CAVLTreeNode<T>* &parent)const;//寻找节点
《平衡二叉树(AVL树)的简单实现》
    CAVLTreeNode<T>* FindMin()const;//找最小值
《平衡二叉树(AVL树)的简单实现》
    CAVLTreeNode<T>* FindMax()const;//找最大值
《平衡二叉树(AVL树)的简单实现》
    void PrintTree();//前序遍历树(非递归)
《平衡二叉树(AVL树)的简单实现》
    virtual ~CAVLTree(void);
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》
protected:
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T>* GetAVLTreeNode(const T& item,CAVLTreeNode<T> *lptr=NULL,CAVLTreeNode<T> *rptr=NULL);
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T>* CopyTree(CAVLTreeNode<T>* t);//拷贝树
《平衡二叉树(AVL树)的简单实现》
    void FreeTreeNode(CAVLTreeNode<T>* p);//释放树节点
《平衡二叉树(AVL树)的简单实现》
    void DeleteTree(CAVLTreeNode<T>* t);//删除树
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》    
//旋转
《平衡二叉树(AVL树)的简单实现》
    void SingleRotateLeft(CAVLTreeNode<T> * &p);
《平衡二叉树(AVL树)的简单实现》    
void SingleRotateRight(CAVLTreeNode<T> *&p);
《平衡二叉树(AVL树)的简单实现》    
void DoubleRotateLeft(CAVLTreeNode<T> *&p);
《平衡二叉树(AVL树)的简单实现》    
void DoubleRotateRight(CAVLTreeNode<T> *&p);
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》    
void UpdateLeftTree(CAVLTreeNode<T>* &tree,int &reviseBalanceFactor);
《平衡二叉树(AVL树)的简单实现》    
void UpdateRightTree(CAVLTreeNode<T>* &tree,int &reviseBalanceFactor);
《平衡二叉树(AVL树)的简单实现》    
void AVLInsert(CAVLTreeNode<T> * &tree,CAVLTreeNode<T> *newnode,int &reviseBalanceFactor);
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》
private:
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *root;//平衡二叉树树根
《平衡二叉树(AVL树)的简单实现》
    int size;//树节点个数
《平衡二叉树(AVL树)的简单实现》
}

;
《平衡二叉树(AVL树)的简单实现》

 

《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》
平衡二叉树实现代码

《平衡二叉树(AVL树)的简单实现》#include BinSTree.h
《平衡二叉树(AVL树)的简单实现》#include 
<iostream>
《平衡二叉树(AVL树)的简单实现》#include 
<stack>
《平衡二叉树(AVL树)的简单实现》
using namespace std;
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
/**//**//**///////////////////////////////////////////////////////////////////////
《平衡二叉树(AVL树)的简单实现》// Construction/Destruction
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
/**//**//**///////////////////////////////////////////////////////////////////////
《平衡二叉树(AVL树)的简单实现》template<typename T>
《平衡二叉树(AVL树)的简单实现》CAVLTree
<T>::CAVLTree()
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    
this->root = NULL;
《平衡二叉树(AVL树)的简单实现》    
this->size = 0;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》CAVLTree
<T>::CAVLTree(const CAVLTree<T>& tree)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    root 
= this->CopyTree(tree.root);
《平衡二叉树(AVL树)的简单实现》    
this->size = tree.size;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》CAVLTree
<T>::~CAVLTree()
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    
this->ClearTree();
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》CAVLTree
<T>& CAVLTree<T>::operator = (const CAVLTree<T>& rhs)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    
if(this==&rhs)
《平衡二叉树(AVL树)的简单实现》        
return *this;
《平衡二叉树(AVL树)的简单实现》    
this->ClearTree();
《平衡二叉树(AVL树)的简单实现》    root 
= this->CopyTree(rhs.root);
《平衡二叉树(AVL树)的简单实现》    size 
= rhs.size;
《平衡二叉树(AVL树)的简单实现》    
return *this;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》CAVLTreeNode
<T>* CAVLTree<T>::GetAVLTreeNode(const T& item,CAVLTreeNode<T>* lptr,CAVLTreeNode<T>* rptr)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T>* p;
《平衡二叉树(AVL树)的简单实现》    p 
= new CAVLTreeNode<T>(item,lptr,rptr);
《平衡二叉树(AVL树)的简单实现》    
if(p==NULL)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        cerr
<<分配内存失败!<<endl;
《平衡二叉树(AVL树)的简单实现》        exit(
1);
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
return p;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》CAVLTreeNode
<T>* CAVLTree<T>::FindMin()const
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *= root;
《平衡二叉树(AVL树)的简单实现》    
while(t->left!=NULL)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        t 
= t->left;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
return t;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》CAVLTreeNode
<T>* CAVLTree<T>::FindMax()const
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *= root;
《平衡二叉树(AVL树)的简单实现》    
while(t->right!=NULL)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        t 
= t->right;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
return t;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
bool CAVLTree<T>::Contains(const T& item)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *p;
《平衡二叉树(AVL树)的简单实现》    
return (this->FindNode(item,p)!=NULL);
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》CAVLTreeNode
<T>* CAVLTree<T>::CopyTree(CAVLTreeNode<T>* t)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *newnode,*newlptr,*newrptr;
《平衡二叉树(AVL树)的简单实现》    
if(t==NULL)
《平衡二叉树(AVL树)的简单实现》        
return NULL;
《平衡二叉树(AVL树)的简单实现》    
if(t->Left()!=NULL)
《平衡二叉树(AVL树)的简单实现》        newlptr 
= CopyTree(t->Left());
《平衡二叉树(AVL树)的简单实现》    
else
《平衡二叉树(AVL树)的简单实现》        newlptr 
= NULL;
《平衡二叉树(AVL树)的简单实现》    
if(t->Right()!=NULL)
《平衡二叉树(AVL树)的简单实现》        newrptr 
= CopyTree(t->Right());
《平衡二叉树(AVL树)的简单实现》    
else
《平衡二叉树(AVL树)的简单实现》        newrptr 
= NULL;
《平衡二叉树(AVL树)的简单实现》    newnode 
= this->GetAVLTreeNode(t->data,newlptr,newrptr);
《平衡二叉树(AVL树)的简单实现》    
return newnode;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::FreeTreeNode(CAVLTreeNode<T>* p)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    delete p;
《平衡二叉树(AVL树)的简单实现》    p 
= NULL;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::DeleteTree(CAVLTreeNode<T>* t)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    
if(t!=NULL)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        DeleteTree(t
->Left());
《平衡二叉树(AVL树)的简单实现》        DeleteTree(t
->Right());
《平衡二叉树(AVL树)的简单实现》        FreeTreeNode(t);
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::ClearTree()
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    DeleteTree(root);
《平衡二叉树(AVL树)的简单实现》    root 
= NULL;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》CAVLTreeNode
<T>* CAVLTree<T>::FindNode(const T& item,CAVLTreeNode<T>* &parent)const
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *= root;
《平衡二叉树(AVL树)的简单实现》    parent 
= NULL;
《平衡二叉树(AVL树)的简单实现》    
while(t!=NULL)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        
if(item==t->data)
《平衡二叉树(AVL树)的简单实现》            
break;
《平衡二叉树(AVL树)的简单实现》        
else
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》        
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》            parent 
= t;
《平衡二叉树(AVL树)的简单实现》            
if(item<t->data)
《平衡二叉树(AVL树)的简单实现》                t 
= t->Left();
《平衡二叉树(AVL树)的简单实现》            
else 
《平衡二叉树(AVL树)的简单实现》                t 
= t->Right();
《平衡二叉树(AVL树)的简单实现》        }

《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
return t;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::Insert(const T& item)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T>* t = root,*parent = NULL,*newnode;
《平衡二叉树(AVL树)的简单实现》    
int reviseBalanceFactor = 0;
《平衡二叉树(AVL树)的简单实现》    newnode 
= this->GetAVLTreeNode(item);
《平衡二叉树(AVL树)的简单实现》    
this->AVLInsert(t,newnode,reviseBalanceFactor);
《平衡二叉树(AVL树)的简单实现》    root 
= t;
《平衡二叉树(AVL树)的简单实现》    size
++;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::AVLInsert(CAVLTreeNode<T> * &tree,CAVLTreeNode<T> *newnode,int &reviseBalanceFactor)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》    
int rebalanceCurrNode;
《平衡二叉树(AVL树)的简单实现》    
if (tree==NULL)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        tree 
= newnode;
《平衡二叉树(AVL树)的简单实现》        tree
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》        reviseBalanceFactor 
= 1;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
else if(newnode->data<tree->data)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        
this->AVLInsert(tree->Left(),newnode,rebalanceCurrNode);
《平衡二叉树(AVL树)的简单实现》        
if (rebalanceCurrNode)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》        
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》            
if (tree->balanceFactor==LEFTHEAVY)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》            
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》                
this->UpdateLeftTree(tree,reviseBalanceFactor);
《平衡二叉树(AVL树)的简单实现》            }

《平衡二叉树(AVL树)的简单实现》            
else if (tree->balanceFactor==BALANCE)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》            
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》                tree
->balanceFactor = LEFTHEAVY;
《平衡二叉树(AVL树)的简单实现》                reviseBalanceFactor 
= 1;
《平衡二叉树(AVL树)的简单实现》            }

《平衡二叉树(AVL树)的简单实现》            
else
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》            
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》                tree
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》                reviseBalanceFactor 
= 0;
《平衡二叉树(AVL树)的简单实现》            }

《平衡二叉树(AVL树)的简单实现》        }

《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
else
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        
this->AVLInsert(tree->Right(),newnode,rebalanceCurrNode);
《平衡二叉树(AVL树)的简单实现》        
if (rebalanceCurrNode)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》        
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》            
if (tree->balanceFactor==LEFTHEAVY)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》            
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》                tree
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》                reviseBalanceFactor 
= 0;
《平衡二叉树(AVL树)的简单实现》            }

《平衡二叉树(AVL树)的简单实现》            
else if (tree->balanceFactor==BALANCE)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》            
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》                tree
->balanceFactor = RIGHTHEAVY;
《平衡二叉树(AVL树)的简单实现》                reviseBalanceFactor 
= 1;
《平衡二叉树(AVL树)的简单实现》            }

《平衡二叉树(AVL树)的简单实现》            
else
《平衡二叉树(AVL树)的简单实现》                
this->UpdateRightTree(tree,reviseBalanceFactor);
《平衡二叉树(AVL树)的简单实现》        }

《平衡二叉树(AVL树)的简单实现》        
else
《平衡二叉树(AVL树)的简单实现》            reviseBalanceFactor 
= 0;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::PrintTree()
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    stack
<CAVLTreeNode<T>* > s;
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T>* p = root;
《平衡二叉树(AVL树)的简单实现》    
while (p!=NULL || !s.empty())
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        
while (p!=NULL)             //遍历左子树
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
        《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》            cout
<<p->data<<endl;
《平衡二叉树(AVL树)的简单实现》            s.push(p);
《平衡二叉树(AVL树)的简单实现》            p
=p->Left();
《平衡二叉树(AVL树)的简单实现》        }
//endwhile
《平衡二叉树(AVL树)的简单实现》

《平衡二叉树(AVL树)的简单实现》        
if (!s.empty())
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》        
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》            p
=s.top();
《平衡二叉树(AVL树)的简单实现》            s.pop();
《平衡二叉树(AVL树)的简单实现》            p
=p->Right();            //通过下一次循环实现右子树遍历
《平衡二叉树(AVL树)的简单实现》
        }
//endif   
《平衡二叉树(AVL树)的简单实现》
    }

《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::UpdateLeftTree(CAVLTreeNode<T> *&tree, int &reviseBalanceFactor)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *lc;
《平衡二叉树(AVL树)的简单实现》    lc 
= tree->Left();
《平衡二叉树(AVL树)的简单实现》    
if (lc->balanceFactor==LEFTHEAVY)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        
this->SingleRotateRight(tree);
《平衡二叉树(AVL树)的简单实现》        reviseBalanceFactor 
= 0;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
else if (lc->balanceFactor==RIGHTHEAVY)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        
this->DoubleRotateRight(tree);
《平衡二叉树(AVL树)的简单实现》        reviseBalanceFactor 
= 0;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::SingleRotateRight(CAVLTreeNode<T> *&p)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *lc;
《平衡二叉树(AVL树)的简单实现》    lc 
= p->Left();
《平衡二叉树(AVL树)的简单实现》    p
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》    lc
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》    p
->left = lc->Right();
《平衡二叉树(AVL树)的简单实现》    lc
->right = p;
《平衡二叉树(AVL树)的简单实现》    p 
= lc;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::DoubleRotateRight(CAVLTreeNode<T> *&p)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *lc,*np;
《平衡二叉树(AVL树)的简单实现》    lc 
= p->Left();
《平衡二叉树(AVL树)的简单实现》    np 
= lc->Right();
《平衡二叉树(AVL树)的简单实现》    
if(np->balanceFactor==RIGHTHEAVY)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        p
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》        lc
->balanceFactor = RIGHTHEAVY;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
else if (np->balanceFactor==BALANCE)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        p
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》        lc
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
else
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        p
->balanceFactor = RIGHTHEAVY;
《平衡二叉树(AVL树)的简单实现》        lc
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    np
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》    lc
->right = np->Left();
《平衡二叉树(AVL树)的简单实现》    np
->left = lc;
《平衡二叉树(AVL树)的简单实现》    p
->left= np->Right();
《平衡二叉树(AVL树)的简单实现》    np
->right = p;
《平衡二叉树(AVL树)的简单实现》    p 
= np;
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::SingleRotateLeft(CAVLTreeNode<T> *&p)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *rc = p->right;
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》    p
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》    rc
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》    p
->right = rc->left;
《平衡二叉树(AVL树)的简单实现》    rc
->left = p;
《平衡二叉树(AVL树)的简单实现》    p 
= rc; 
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::DoubleRotateLeft(CAVLTreeNode<T> *&p)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *rc, *np;
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》    rc 
= p->right;
《平衡二叉树(AVL树)的简单实现》    np 
= rc->left;
《平衡二叉树(AVL树)的简单实现》    
if (np->balanceFactor == LEFTHEAVY)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        p
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》        rc
->balanceFactor = LEFTHEAVY;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
else if (np->balanceFactor == BALANCE)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        p
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》        rc
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
else
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        p
->balanceFactor = LEFTHEAVY;
《平衡二叉树(AVL树)的简单实现》        rc
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    np
->balanceFactor = BALANCE;
《平衡二叉树(AVL树)的简单实现》    rc
->left = np->right;
《平衡二叉树(AVL树)的简单实现》    np
->right = rc;
《平衡二叉树(AVL树)的简单实现》    p
->right = np->left;
《平衡二叉树(AVL树)的简单实现》    np
->left = p;
《平衡二叉树(AVL树)的简单实现》    p 
= np; 
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》template
<typename T>
《平衡二叉树(AVL树)的简单实现》
void CAVLTree<T>::UpdateRightTree(CAVLTreeNode<T> *&tree, int &reviseBalanceFactor)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<T> *rc = tree->right;
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》    
if (rc->balanceFactor == RIGHTHEAVY)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        SingleRotateLeft(tree);
《平衡二叉树(AVL树)的简单实现》        reviseBalanceFactor 
= false;
《平衡二叉树(AVL树)的简单实现》    }

《平衡二叉树(AVL树)的简单实现》    
else if (rc->balanceFactor == LEFTHEAVY)
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》    
《平衡二叉树(AVL树)的简单实现》{
《平衡二叉树(AVL树)的简单实现》        DoubleRotateLeft(tree);
《平衡二叉树(AVL树)的简单实现》        reviseBalanceFactor 
= false;
《平衡二叉树(AVL树)的简单实现》    }
 
《平衡二叉树(AVL树)的简单实现》}

《平衡二叉树(AVL树)的简单实现》

测试代码

《平衡二叉树(AVL树)的简单实现》
#include 

BinSTree.cpp


《平衡二叉树(AVL树)的简单实现》#include 

<
iostream
>

《平衡二叉树(AVL树)的简单实现》

using
 
namespace
 std;
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》CAVLTree

<
int
>*
 MakeSampleTree()
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》

《平衡二叉树(AVL树)的简单实现》
{//示例AVL树
《平衡二叉树(AVL树)的简单实现》
    CAVLTree<int> *tree1 = new CAVLTree<int>();
《平衡二叉树(AVL树)的简单实现》    
int a = 5;
《平衡二叉树(AVL树)的简单实现》    tree1
->Insert(a);
《平衡二叉树(AVL树)的简单实现》    tree1
->Insert(30);
《平衡二叉树(AVL树)的简单实现》    tree1
->Insert(65);
《平衡二叉树(AVL树)的简单实现》    tree1
->Insert(25);
《平衡二叉树(AVL树)的简单实现》    tree1
->Insert(35);
《平衡二叉树(AVL树)的简单实现》    tree1
->Insert(50);
《平衡二叉树(AVL树)的简单实现》    tree1
->Insert(10);
《平衡二叉树(AVL树)的简单实现》    tree1
->Insert(28);
《平衡二叉树(AVL树)的简单实现》    tree1
->Insert(26);
《平衡二叉树(AVL树)的简单实现》    tree1
->Insert(33);
《平衡二叉树(AVL树)的简单实现》    
return tree1;
《平衡二叉树(AVL树)的简单实现》}


《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》

int
 main(
int
 argc, 
char
*
 argv[])
《平衡二叉树(AVL树)的简单实现》《平衡二叉树(AVL树)的简单实现》

《平衡二叉树(AVL树)的简单实现》
{
《平衡二叉树(AVL树)的简单实现》    CAVLTree
<int> *tree1 = MakeSampleTree();
《平衡二叉树(AVL树)的简单实现》    tree1
->PrintTree();
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》    cout
<<tree1->Contains(40)<<endl;
《平衡二叉树(AVL树)的简单实现》    CAVLTreeNode
<int> *= tree1->FindMin();
《平衡二叉树(AVL树)的简单实现》    cout
<<p->data<<endl;
《平衡二叉树(AVL树)的简单实现》    system(
pause);
《平衡二叉树(AVL树)的简单实现》    
return 0;
《平衡二叉树(AVL树)的简单实现》}


《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》
《平衡二叉树(AVL树)的简单实现》

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/phinecos/archive/2008/07/22/1249012.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞