平衡二叉樹(AVL樹)的簡單實現

作者: Phinecos(洞庭散人)  來源: 博客園  發布時間: 2008-08-16 22:39  閱讀: 1338 次  推薦: 0   原文鏈接   [收藏]  
#include <stdlib.h>

template
<typename T>
class CAVLTree;

template
<typename T>
class CAVLTreeNode
{
public:
    CAVLTreeNode(
const T& item,CAVLTreeNode<T>* lptr = NULL,CAVLTreeNode<T>* rptr = NULL,int balfac=0):data(item),left(lptr),right(rptr),balanceFactor(balfac)
    
{
    }

    CAVLTreeNode<T>* Left(void)const
    {
        
return left;
    }

    CAVLTreeNode<T>* Right(void)const
    {
        
return right;
    }

    int GetBalanceFactor()const
    {
        
return this->balanceFactor;
    }

    friend class CAVLTree<T>;
public:
    T data;
//數據
private:
    CAVLTreeNode
<T>* left;//左子樹
    CAVLTreeNode<T>* right;//右子樹
    int balanceFactor;//平衡因子
    CAVLTreeNode<T>* & Left(void)
    
{
        
return left;
    }

    CAVLTreeNode<T>* & Right(void)
    
{
        
return right;
    }


}
;

const int LEFTHEAVY = -1;
const int BALANCE = 0;
const int RIGHTHEAVY = 1;

template
<typename T>
class CAVLTree
{
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);

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);//刪除樹

    
//旋轉
    void SingleRotateLeft(CAVLTreeNode<T> * &p);
    
void SingleRotateRight(CAVLTreeNode<T> *&p);
    
void DoubleRotateLeft(CAVLTreeNode<T> *&p);
    
void DoubleRotateRight(CAVLTreeNode<T> *&p);

    
void UpdateLeftTree(CAVLTreeNode<T>* &tree,int &reviseBalanceFactor);
    
void UpdateRightTree(CAVLTreeNode<T>* &tree,int &reviseBalanceFactor);
    
void AVLInsert(CAVLTreeNode<T> * &tree,CAVLTreeNode<T> *newnode,int &reviseBalanceFactor);

private:
    CAVLTreeNode
<T> *root;//平衡二叉樹樹根
    int size;//樹節點個數
}
;

 

平衡二叉樹實現代碼

測試代碼

#include "BinSTree.cpp"
#include <iostream>
using namespace std;

CAVLTree
<int>* MakeSampleTree()
{//示例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;
}


int main(int argc, char* argv[])
{
    CAVLTree
<int> *tree1 = MakeSampleTree();
    tree1
->PrintTree();

    cout
<<tree1->Contains(40)<<endl;
    CAVLTreeNode
<int> *= tree1->FindMin();
    cout
<<p->data<<endl;
    system(
"pause");
    
return 0;
}
0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()