一步一步写平衡二叉树(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讲的很好,不过没有很完整的去描述。我会一步一步的讲解如何写平衡二叉树,重点是平衡二叉树的核心部分,也就是旋转算法。
第一步:节点信息
相对于二叉查找树的节点来说,我们需要用一个属性二叉树的高度,目的是维护插入和删除过程中的旋转算法。
代码如下:
分享到:
相关推荐
java数据结构与算法之平衡二叉树AVL树的设计与实现分析.doc
二叉树的应用:二叉排序树BST和平衡二叉树AVL的构造实验报告
平衡二叉树(Balanced Binary Tree)又被称为AVL树。具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法。 实验目的: 二叉排序树的实现...
首先实现BST二叉搜索树,在BST的基础上做出AVL树,有插入、删除、查询、调整平衡的功能,而且可以和BST比较的过程。By Michael Zhou
AVL管理数据 struct branch{ unsigned int data; /* actual data */ struct branch * l_chld, * r_chld; /* left & right child */ short bc; /* balance coefficient */ }; #define avl_entry (T, P, M) (T *)...
关于平衡二叉树的学习笔记,并提供二叉树平衡、插入及删除的代码、提供一个简单的打印二叉树结构的函数(打印对齐不是很好),方便代码调试。
NULL 博文链接:https://709002341.iteye.com/blog/2258678
主要介绍了C语言数据结构之平衡二叉树(AVL树)实现方法,结合实例形式分析了C语言平衡二叉树的相关定义与使用技巧,需要的朋友可以参考下
排序二叉树 AVL树 哈夫曼树增删改查Java实现
将平衡二叉树的增删改查集成到了一起,提供友好的界面。
查找算法,平衡二叉树,大话数据结构里面的。
一棵AVL树或者是空树,或者是具有下列性质的二叉搜索树:它的左子树和右子树都是AVL树,且左子树和右子树的高度之差的绝对值不超过1。
目前只做了增加删除节点时二叉树自动平衡,保证这棵树什么时候都是平衡状态;如何将一棵不平衡的二叉树平衡呢(左右子树的高度差值很大)?不管是从根节点还是从最小不平衡二叉树开始旋转平衡,可能都会出现一次遍历...
自己写的AVL树模板源代码,包括插入,删除等操作.
平衡二叉树插入节点和删除节点
平衡二叉树的实现 建立 搜索 插入 删除 遍历 希望对你有所帮助
自己用c语言实现的平衡二叉树,可以实现插入,删除,查找,效率很高,分享给大家.
平衡二叉树Java实现,平衡二叉树Java实现,平衡二叉树Java实现,平衡二叉树Java实现,