前面所讲的二叉搜索树有个比较严重致命的问题就是极端状况下当数据以排序好的顺序建立搜索树此时二叉搜索树将退化为链表结构所以性能也大幅度降低,所以为了解决此问题咱们下面要介绍的与二叉搜索树很是相似的结构就诞生了;性能
AVL(Adelson-Velskii and Landis)树,名字取自其发明者 G.M. Adelson-Velsky 和 E.M. Landis的首字母,AVL树是一棵特殊的二叉搜索树它与普通二叉搜索树最主要的区别就是其可以使二叉搜索树维持其左右节点的平衡;
AVL树:其任意一个节点左子树与右子树高度差不超过1,因为此特征所以须要在AVL增删节点时维护其左右节点使该树知足该特性(左右节点平衡);code
此AVL树中节点2节点高度都为2,节点1与3节点高度都为1;节点高度为左右子树中最大的节点高度+1;对象
AVL树实现关键blog
一、标注其节点高度
二、计算节点平衡因子
三、维护其节点知足左右节点高度不超过1排序
一、AVL树定义
根据AVL树的特性先定义该数据类型的结构;递归
type AVL struct { root *AVLNode size int compare Comparable } type AVLNode struct { e interface{} left *AVLNode right *AVLNode height int }
AVL:为定义的AVL树自定义对象
AVLNode:为树中每一个节点的节点自定义对象
compare:为定义的用于树中节点元素进行数据对比的对象
size:AVL树的元素个数
root:树的根节点
e:节点元素值
left:左子树
right:右子树
height:节点高度get
AVL树与二叉搜索树同样全部不少操做均可用递归来实现,好比元素的添加、删除、查找等;
能够说AVL树为二叉搜索树的升级版本因此并不会像出现二叉搜索树同样出现退化为O(n)时间复杂度的状况,与二叉搜索树同样经过中序遍历可获得排序好的数据,二叉搜索树的搜索、插入、删除时间复杂度为O(log(n)),n为树的深度,这里只是简单的介绍了AVL树,后面会有AVL树实现的相关介绍;it
文章首发地址:Solinx
http://www.solinx.co/archives/1323class