作者:
Phinecos(洞庭散人) 來源:
博客園 發布時間: 2008-08-16 22:39 閱讀: 1338 次 推薦: 0
原文鏈接 [收藏]
#include <stdlib.h>
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
class CAVLTree;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
class CAVLTreeNode
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public:
CAVLTreeNode(const T& item,CAVLTreeNode<T>* lptr = NULL,CAVLTreeNode<T>* rptr = NULL,int balfac=0):data(item),left(lptr),right(rptr),balanceFactor(balfac)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
}
CAVLTreeNode<T>* Left(void)const
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return left;
}
CAVLTreeNode<T>* Right(void)const
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return right;
}
int GetBalanceFactor()const
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this->balanceFactor;
}
friend class CAVLTree<T>;
public:
T data;//數據
private:
CAVLTreeNode<T>* left;//左子樹
CAVLTreeNode<T>* right;//右子樹
int balanceFactor;//平衡因子
CAVLTreeNode<T>* & Left(void)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return left;
}
CAVLTreeNode<T>* & Right(void)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return right;
}
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
};
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
const int LEFTHEAVY = -1;
const int BALANCE = 0;
const int RIGHTHEAVY = 1;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
class CAVLTree
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public:
CAVLTree(void);
CAVLTree(const CAVLTree<T>& tree);
CAVLTree& operator = (const CAVLTree& rhs);
void Insert(const T& item);
void ClearTree();//清空樹
bool Contains(const T& item);//是否包含數據
CAVLTreeNode<T>* FindNode(const T& item,CAVLTreeNode<T>* &parent)const;//尋找節點
CAVLTreeNode<T>* FindMin()const;//找最小值
CAVLTreeNode<T>* FindMax()const;//找最大值
void PrintTree();//前序遍歷樹(非遞歸)
virtual ~CAVLTree(void);
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
protected:
CAVLTreeNode<T>* GetAVLTreeNode(const T& item,CAVLTreeNode<T> *lptr=NULL,CAVLTreeNode<T> *rptr=NULL);
CAVLTreeNode<T>* CopyTree(CAVLTreeNode<T>* t);//拷貝樹
void FreeTreeNode(CAVLTreeNode<T>* p);//釋放樹節點
void DeleteTree(CAVLTreeNode<T>* t);//刪除樹
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//旋轉
void SingleRotateLeft(CAVLTreeNode<T> * &p);
void SingleRotateRight(CAVLTreeNode<T> *&p);
void DoubleRotateLeft(CAVLTreeNode<T> *&p);
void DoubleRotateRight(CAVLTreeNode<T> *&p);
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
void UpdateLeftTree(CAVLTreeNode<T>* &tree,int &reviseBalanceFactor);
void UpdateRightTree(CAVLTreeNode<T>* &tree,int &reviseBalanceFactor);
void AVLInsert(CAVLTreeNode<T> * &tree,CAVLTreeNode<T> *newnode,int &reviseBalanceFactor);
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private:
CAVLTreeNode<T> *root;//平衡二叉樹樹根
int size;//樹節點個數
};
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif&width=11&height=16)
平衡二叉樹實現代碼
#include "BinSTree.h"
#include <iostream>
#include <stack>
using namespace std;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//**//**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//**//**///////////////////////////////////////////////////////////////////////
template<typename T>
CAVLTree<T>::CAVLTree()
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
this->root = NULL;
this->size = 0;
}
template<typename T>
CAVLTree<T>::CAVLTree(const CAVLTree<T>& tree)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
root = this->CopyTree(tree.root);
this->size = tree.size;
}
template<typename T>
CAVLTree<T>::~CAVLTree()
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
this->ClearTree();
}
template<typename T>
CAVLTree<T>& CAVLTree<T>::operator = (const CAVLTree<T>& rhs)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
if(this==&rhs)
return *this;
this->ClearTree();
root = this->CopyTree(rhs.root);
size = rhs.size;
return *this;
}
template<typename T>
CAVLTreeNode<T>* CAVLTree<T>::GetAVLTreeNode(const T& item,CAVLTreeNode<T>* lptr,CAVLTreeNode<T>* rptr)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T>* p;
p = new CAVLTreeNode<T>(item,lptr,rptr);
if(p==NULL)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
cerr<<"分配內存失敗!"<<endl;
exit(1);
}
return p;
}
template<typename T>
CAVLTreeNode<T>* CAVLTree<T>::FindMin()const
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T> *t = root;
while(t->left!=NULL)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
t = t->left;
}
return t;
}
template<typename T>
CAVLTreeNode<T>* CAVLTree<T>::FindMax()const
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T> *t = root;
while(t->right!=NULL)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
t = t->right;
}
return t;
}
template<typename T>
bool CAVLTree<T>::Contains(const T& item)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T> *p;
return (this->FindNode(item,p)!=NULL);
}
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
CAVLTreeNode<T>* CAVLTree<T>::CopyTree(CAVLTreeNode<T>* t)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T> *newnode,*newlptr,*newrptr;
if(t==NULL)
return NULL;
if(t->Left()!=NULL)
newlptr = CopyTree(t->Left());
else
newlptr = NULL;
if(t->Right()!=NULL)
newrptr = CopyTree(t->Right());
else
newrptr = NULL;
newnode = this->GetAVLTreeNode(t->data,newlptr,newrptr);
return newnode;
}
template<typename T>
void CAVLTree<T>::FreeTreeNode(CAVLTreeNode<T>* p)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
delete p;
p = NULL;
}
template<typename T>
void CAVLTree<T>::DeleteTree(CAVLTreeNode<T>* t)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
if(t!=NULL)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
DeleteTree(t->Left());
DeleteTree(t->Right());
FreeTreeNode(t);
}
}
template<typename T>
void CAVLTree<T>::ClearTree()
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
DeleteTree(root);
root = NULL;
}
template<typename T>
CAVLTreeNode<T>* CAVLTree<T>::FindNode(const T& item,CAVLTreeNode<T>* &parent)const
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T> *t = root;
parent = NULL;
while(t!=NULL)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(item==t->data)
break;
else
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
parent = t;
if(item<t->data)
t = t->Left();
else
t = t->Right();
}
}
return t;
}
template<typename T>
void CAVLTree<T>::Insert(const T& item)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T>* t = root,*parent = NULL,*newnode;
int reviseBalanceFactor = 0;
newnode = this->GetAVLTreeNode(item);
this->AVLInsert(t,newnode,reviseBalanceFactor);
root = t;
size++;
}
template<typename T>
void CAVLTree<T>::AVLInsert(CAVLTreeNode<T> * &tree,CAVLTreeNode<T> *newnode,int &reviseBalanceFactor)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int rebalanceCurrNode;
if (tree==NULL)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
tree = newnode;
tree->balanceFactor = BALANCE;
reviseBalanceFactor = 1;
}
else if(newnode->data<tree->data)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this->AVLInsert(tree->Left(),newnode,rebalanceCurrNode);
if (rebalanceCurrNode)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (tree->balanceFactor==LEFTHEAVY)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this->UpdateLeftTree(tree,reviseBalanceFactor);
}
else if (tree->balanceFactor==BALANCE)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
tree->balanceFactor = LEFTHEAVY;
reviseBalanceFactor = 1;
}
else
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
tree->balanceFactor = BALANCE;
reviseBalanceFactor = 0;
}
}
}
else
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this->AVLInsert(tree->Right(),newnode,rebalanceCurrNode);
if (rebalanceCurrNode)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (tree->balanceFactor==LEFTHEAVY)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
tree->balanceFactor = BALANCE;
reviseBalanceFactor = 0;
}
else if (tree->balanceFactor==BALANCE)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
tree->balanceFactor = RIGHTHEAVY;
reviseBalanceFactor = 1;
}
else
this->UpdateRightTree(tree,reviseBalanceFactor);
}
else
reviseBalanceFactor = 0;
}
}
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<typename T>
void CAVLTree<T>::PrintTree()
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
stack<CAVLTreeNode<T>* > s;
CAVLTreeNode<T>* p = root;
while (p!=NULL || !s.empty())
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
while (p!=NULL) //遍歷左子樹
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
cout<<p->data<<endl;
s.push(p);
p=p->Left();
}//endwhile
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (!s.empty())
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
p=s.top();
s.pop();
p=p->Right(); //通過下一次循環實現右子樹遍歷
}//endif
}
}
template<typename T>
void CAVLTree<T>::UpdateLeftTree(CAVLTreeNode<T> *&tree, int &reviseBalanceFactor)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T> *lc;
lc = tree->Left();
if (lc->balanceFactor==LEFTHEAVY)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this->SingleRotateRight(tree);
reviseBalanceFactor = 0;
}
else if (lc->balanceFactor==RIGHTHEAVY)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this->DoubleRotateRight(tree);
reviseBalanceFactor = 0;
}
}
template<typename T>
void CAVLTree<T>::SingleRotateRight(CAVLTreeNode<T> *&p)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T> *lc;
lc = p->Left();
p->balanceFactor = BALANCE;
lc->balanceFactor = BALANCE;
p->left = lc->Right();
lc->right = p;
p = lc;
}
template<typename T>
void CAVLTree<T>::DoubleRotateRight(CAVLTreeNode<T> *&p)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T> *lc,*np;
lc = p->Left();
np = lc->Right();
if(np->balanceFactor==RIGHTHEAVY)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
p->balanceFactor = BALANCE;
lc->balanceFactor = RIGHTHEAVY;
}
else if (np->balanceFactor==BALANCE)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
p->balanceFactor = BALANCE;
lc->balanceFactor = BALANCE;
}
else
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
p->balanceFactor = RIGHTHEAVY;
lc->balanceFactor = BALANCE;
}
np->balanceFactor = BALANCE;
lc->right = np->Left();
np->left = lc;
p->left= np->Right();
np->right = p;
p = np;
}
template<typename T>
void CAVLTree<T>::SingleRotateLeft(CAVLTreeNode<T> *&p)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T> *rc = p->right;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
p->balanceFactor = BALANCE;
rc->balanceFactor = BALANCE;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
p->right = rc->left;
rc->left = p;
p = rc;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
template<typename T>
void CAVLTree<T>::DoubleRotateLeft(CAVLTreeNode<T> *&p)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T> *rc, *np;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
rc = p->right;
np = rc->left;
if (np->balanceFactor == LEFTHEAVY)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
p->balanceFactor = BALANCE;
rc->balanceFactor = LEFTHEAVY;
}
else if (np->balanceFactor == BALANCE)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
p->balanceFactor = BALANCE;
rc->balanceFactor = BALANCE;
}
else
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
p->balanceFactor = LEFTHEAVY;
rc->balanceFactor = BALANCE;
}
np->balanceFactor = BALANCE;
rc->left = np->right;
np->right = rc;
p->right = np->left;
np->left = p;
p = np;
}
template<typename T>
void CAVLTree<T>::UpdateRightTree(CAVLTreeNode<T> *&tree, int &reviseBalanceFactor)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTreeNode<T> *rc = tree->right;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (rc->balanceFactor == RIGHTHEAVY)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
SingleRotateLeft(tree);
reviseBalanceFactor = false;
}
else if (rc->balanceFactor == LEFTHEAVY)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
DoubleRotateLeft(tree);
reviseBalanceFactor = false;
}
}
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
測試代碼
#include "BinSTree.cpp"
#include <iostream>
using namespace std;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
CAVLTree<int>* MakeSampleTree()
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//示例AVL樹
CAVLTree<int> *tree1 = new CAVLTree<int>();
int a = 5;
tree1->Insert(a);
tree1->Insert(30);
tree1->Insert(65);
tree1->Insert(25);
tree1->Insert(35);
tree1->Insert(50);
tree1->Insert(10);
tree1->Insert(28);
tree1->Insert(26);
tree1->Insert(33);
return tree1;
}
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
int main(int argc, char* argv[])
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
CAVLTree<int> *tree1 = MakeSampleTree();
tree1->PrintTree();
![](https://imageproxy.pixnet.cc/imgproxy?url=https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
cout<<tree1->Contains(40)<<endl;
CAVLTreeNode<int> *p = tree1->FindMin();
cout<<p->data<<endl;
system("pause");
return 0;
}
文章列表