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

复制代码

#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;
}



复制代码

posted on   Phinecos(洞庭散人)  阅读(2402)  评论(1编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

统计

点击右上角即可分享
微信分享提示