- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(一步一步写平衡二叉树
一步一步写平衡二叉树(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树节点信息
templateclass T
class TreeNode
{
public:
TreeNode():lson(NULL),rson(NULL),freq(1),hgt(0){}
T data;//值
int hgt;//以此节点为根的树的高度
unsigned int freq;//频率
TreeNode* lson;//指向左儿子的地址
TreeNode* rson;//指向右儿子的地址
};
第二步:平衡二叉树类的声明
声明中的旋转函数将在后边的步骤中详解。
代码如下:
//AVL树类的属性和方法声明
templateclass T
class AVLTree
{
private:
TreeNodeT* root;//根节点
void insertpri(TreeNodeT* node,T x);//插入
TreeNodeT* findpri(TreeNodeT* node,T x);//查找
void insubtree(TreeNodeT* node);//中序遍历
void Deletepri(TreeNodeT* node,T x);//删除
int height(TreeNodeT* node);//求树的高度
void SingRotateLeft(TreeNodeT* k2);//左左情况下的旋转
void SingRotateRight(TreeNodeT* k2);//右右情况下的旋转
void DoubleRotateLR(TreeNodeT* k3);//左右情况下的旋转
void DoubleRotateRL(TreeNodeT* k3);//右左情况下的旋转
int Max(int cmpa,int cmpb);//求最大值
public:
AVLTree():root(NULL){}
void insert(T x);//插入接口
TreeNodeT* find(T x);//查找接口
void Delete(T x);//删除接口
void traversal();//遍历接口
};
第三步:两个辅助方法
旋转算法需要借助于两个功能的辅助,一个是求树的高度,一个是求两个高度的最大值。这里规定,一棵空树的高度为-1,只有一个根节点的树的高度为0,以后每多一层高度加1。为了解决指针NULL这种情况,写了一个求高度的函数,这个函数还是很有必要的。
代码如下:
//计算以节点为根的树的高度
templateclass T
int AVLTreeT::height(TreeNodeT* node)
{
if(node!=NULL)
return node-hgt;
return -1;
}
//求最大值
您可能关注的文档
- [人教版八年级思想品德下册第一单元测试卷.doc
- [人教版八年级思想品德综合测试上下册.doc
- (一些有关于学计算机的建议.doc
- [人教版八年级数学上学期月考试卷2含答案.doc
- [人教版八年级数学上第七单元测试卷.doc
- [人教版八年级思想品德第一课试题.doc
- (一些细碎而重要的知识点.doc
- (一些经典的关于人生和职场的哲理.doc
- [人教版八年级数学下册第十八章勾股定理单元测试题附答案.doc
- [人教版八年级数学下册课程纲要.doc
- [人教版试题试卷2011~2012生物必修二期末复习45分钟总检测题一.doc
- [人教版试题试卷2013年高中生物人教版同步习题章末检测1必修2Word版含答案.doc
- [人教版试题试卷山东省平度一中20102011学年第二学期期末考试高一生物试题.doc
- [人教版试题试卷山东省烟台市20112012学年高二上学期期末考试生物A试题.doc
- [人教版试题试卷江西西山高中高一3月份月考生物试题.doc
- [人教版试题试卷河北省衡水中学20082009学年高一下学期第一次调研考试生物试卷.doc
- [人教版试题试卷高一下学期期中考试生物试题.doc
- [人教版语文11册第三单元测评试卷.doc
- [人教版语文2016年中考试卷.doc
- [人教版语文七年级上册积累及运用专题测试.doc
原创力文档


文档评论(0)