对称二叉树c++_一步一步写平衡二叉树(AVL树)

一步一步写平衡二叉树(AVL树)

作者:C小加 更新时间:2012-8-20

平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树。1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵树,所以它又叫AVL树。平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。

平衡二叉树实现的大部分过程和二叉查找树是一样的(学平衡二叉树之前一定要会二叉查找树),区别就在于插入和删除之后要写一个旋转算法去维持平衡,维持平衡需要借助一个节点高度的属性。我参考了机械工业出版社的《数据结构与算法分析-C语言描述》写了一个C++版的代码。这本书的AVLTree讲的很好,不过没有很完整的去描述。我会一步一步的讲解如何写平衡二叉树,重点是平衡二叉树的核心部分,也就是旋转算法。

第一步:节点信息

相对于二叉查找树的节点来说,我们需要用一个属性二叉树的高度,目的是维护插入和删除过程中的旋转算法。

代码如下:

//AVL树节点信息template

class TreeNode

{

public:

TreeNode():lson(NULL),rson(NULL),freq(1),hgt(0){}

T data;//值        int hgt;//以此节点为根的树的高度        unsigned int freq;//频率        TreeNode* lson;//指向左儿子的地址        TreeNode* rson;//指向右儿子的地址};

第二步:平衡二叉树类的声明

声明中的旋转函数将在后边的步骤中详解。

代码如下:

//AVL树类的属性和方法声明template

class AVLTree

{

private:

TreeNode* root;//根节点        void insertpri(TreeNode* &node,T x);//插入        TreeNode* findpri(TreeNode* node,T x);//查找        void insubtree(TreeNode* node);//中序遍历        void Deletepri(TreeNode* &node,T x);//删除        int height(TreeNode* node);//求树的高度        void SingRotateLeft(TreeNode* &k2);//左左情况下的旋转        void SingRotateRight(TreeNode* &k2);//右右情况下的旋转        void DoubleRotateLR(TreeNode* &k3);//左右情况下的旋转        void DoubleRotateRL(TreeNode* &k3);//右左情况下的旋转        int Max(int cmpa,int cmpb);//求最大值

public:

AVLTree():root(NULL){}

void insert(T x);//插入接口        TreeNode* find(T x);//查找接口        void Delete(T x);//删除接口        void traversal();//遍历接口

};

第三步:两个辅助方法

旋转算法需要借助于两个功能的辅助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值