总之,二叉排序树是以链接的方式存储,保持了链接存储结构在执行插入或删除操作时不用移动元素的优点,只要找到合适的插入和删除位置后,仅需修改链接指针即可。插入删除的时间性能比较好。而对于二叉排序树的查找,走的就是从根结点到要查找的结点的路径,其比较次数等于给定值的结点在二叉排序树的层数。极端情况,最少为1次,即根结点就是要找的结点,最多也不会超过树的深度。也就是说,二叉排序树的查找性能取决于二叉排序树的形状。可问题就在于,二叉排序树的形状是不确定的。

    例如{62,88,58,47,35,73,51,99,37,93}这样的数组,我们可以构建如图8-6-18左图的二叉排序树。但如果数组元素的次序是从小到大有序,如{35,37,47,51,58,62,73,88,93,99},则二叉排序树就成了极端的右斜树,注意它依然是一棵二叉排序树,如图8-6-18的右图。此时,同样是查找结点99,左图只需要两次比较,而右图就需要10次比较才可以得到结果,二者差异很大。
    image.png
    也就是说,我们希望二叉排序树是比较平衡的,即其深度与完全二叉树相同,均为logn,那么查找的时间复杂也就为O(logn),近似于折半查找,事实上,图8-6-18的左图也不够平衡,明显的左重右轻。

    不平衡的最坏情况就是像图8-6-18右图的斜树,查找时间复杂度为O(n),这等同于顺序查找。

    因此,如果我们希望对一个集合按二叉排序树查找,最好是把它构建成一棵平衡的二叉排序树。这样我们就引申出另一个问题,如何让二叉排序树平衡的问题。