平衡树与非平衡树简介

     在二叉树中已经讲过,普通的二叉搜索树作为数据存储工具具有重要的优势:可以快速地找到一个给定值的数据项,并且可以快速的插入数据和删除数据。其他的数据存储结构,如数组在删除元素时必须要对删除元素后面的每一位元素都进行前移操作,而链表查询元素时必须要从初始元素一个一个的遍历到待查询元素,执行操作都不如二叉树来的快。

     但是,在二叉树文章中末尾讲过,如果树中插入的是随机数据,则增删查操作执行效果很好,因为数据是分散的、无序的。但是,如果插入的是有序数据(10,20,30,40...)或者(96,80,56,32...), 二叉树的执行效率会变得特别慢,因为当插入的数据有序时,二叉树就是非平衡的了。而对于非平衡树,它的快速查找(插入,删除)指定项的能力就丧失了。

    因为二叉树中任意一个节点的左子节点的关键字值小于这个节点的值,右子节点的关键字的值大于或等于这个节点的值。

例如

    向树中依次插入(10,20,30,40...),最终树的形态如图:

平衡树与非平衡树简介_第1张图片

    向树中依次插入(96,80,56,32...),最终树的形态如图:

平衡树与非平衡树简介_第2张图片

    

    当树没有分支时,它其实就是一个链表(甚至比链表查询速度还要慢,毕竟链表不需要每一步都进行比较操作)。数据的排列是一维的,而不是二维的。不幸的是,和链表一样,现在就必须要(平均)查找一半的数据项来寻找要找的数据项。这种情况下,查询的速度下降到O(N),而不是平衡树的O(logN)。

   例如在一棵有10000个数据项的非平衡树中搜索数据平均要5000次比较,而在随机插入生成的平衡树中搜索数据项只需要14次(log2 (10000))比较。

   由部分无序的数据所生成的树只是部分不平衡。

平衡树与非平衡树简介_第3张图片

   尽管部分不平衡树比最不平衡树情况要好,但是在这种情况下搜索花费的时间在O(N)和O(logN)之间,这取决于树的不平衡程度。显然,在这种情况下的查找时间不是最佳的。


   为了能以较快的时间O(logN)来搜索一棵树,需要保证树总是平衡的(或者至少大部分是平衡的)。这就是说对于树中的每个节点在它左边的后代数目和在它右边的后代数目应该大致相等。

  关于如何保证树的平衡性,在后面的文章中再详细讲解。


  注: 本文内容参考于Java数据结构和算法第二版,如有错误和疑问请留言,共同进步。

你可能感兴趣的:(数据结构与算法)