平衡二叉树,又称AVL树,指的是左子树上的所有节点的值都比根节点的值小,而右子树上的所有节点的值都比根节点的值大,且左子树与右子树的高度差最大为1。因此,平衡二叉树满足所有二叉排序(搜索)树的性质。至于AVL,则是取自两个发明平衡二叉树的科学家的名字:G. M. Adelson-Velsky和E. M. Landis。
二叉搜索树
平衡二叉树是在二叉排序树的基础上发展而来的,那为什么要引入二叉搜索树呢?
所谓二叉搜索树(Binary Search Tree),又叫二叉排序树,简单而言就是左子树上所有节点的值均小于根节点的值,而右子树上所有结点的值均大于根节点的值,左小右大,并不是乱序,因此得名二叉排序树。
一个新事物不能凭空产生,那二叉搜索树又有什么用呢?
有了二叉搜索树,当你要查找一个值,就不需要遍历整个序列或者说遍历整棵树了,可以根据当前遍历到的结点的值来确定搜索方向,这就好比你要去日本,假设你没有见过世界地图,你不知道该往哪个方向走,只能满地球找一遍才能保证一定能够到达日本;而如果你见过世界地图,你知道日本在中国的东边,你就不会往西走、往南走、往北走。这种思维在搜索中被叫做“剪枝”,把不必要的分枝剪掉可以提高搜索效率。在二叉搜索树中查找值,每次都会把搜索范围缩小,与二分搜索的思维类似。
如下图所示的二叉搜索树:
要想查找到8,则是先到达根节点,其值为5,8比5大因此继续往右子树上找,到达9,8比9小因此往左子树上找,最终找到8;
要想查找4,则是先到达根节点其值为5,4比5小因此往左子树上找,到达1,4比1大因此往右子树上找,到达3,4比3大因此往右子树上找,而值为3的节点的右子树是空的,因此该搜索二叉树中不存在值为4的节点。
有了二叉排序树就可以使插入、搜索效率大大提高了,为什么还要引入平衡二叉树?
二叉搜索树的结构与值的插入顺序有关,同一组数,若其元素的插入顺序不同,二叉搜索树的结构是千差万别的。举个例子,给出一组数[1,3,5,8,9,13]。
若按照[5,1,3,9,13,8]这样的顺序插入,其流程是这样的:
若按照[1,3,5,8,9,13]这样的顺序插入,其流程是这样的: