二叉搜索树概要


#1.为什么要二叉搜索树?

顺序存储的排序数组可以支持如下的操作:

enter image description here

但是插入和删除的时候时间复杂度达到\(O(n)\),顺序存储结构不适于动态的情况。如果使用链表的话插入和删除就可以在常数时间内完成,但是链表的查找却需要\(O(n)\);两种数据结构各有优点和缺点,使用场合不同。

二叉搜索树是结合了排序数组和排序链表二者优点的数据结构,二叉搜索树是满足:左孩子<=节点值<=右孩子 的二叉树,各种操作时间复杂度只平均要\(logn\)(平衡的二叉搜索树):

enter image description here

二叉搜索树可以进行的操作相当多,但是如果只需要如查找、插入、删除,Hashtable可以做的更好,如果只需要最大/最小、插入、删除Heap更好,应更具不同情况下选择更适合的数据结构。

#2.平衡二叉搜索树

二叉搜索树的各种操作时间复杂度和树高相关,\(n\)个节点的满二叉搜索树高度为\(log_2n\)。因此要保证二叉搜索树的效率,就要尽可能的使二叉搜索树平衡,这样树高就会达到最小。如果二叉搜索树退化成链表,则树高就变成\(n\),所有操作的时间复杂度就达到了\(O(n)\),那么给定节点的二叉搜索树有多少种?看这里

为了让二叉搜索达到树平衡,提高二叉搜索树的效率,产生了很多方法。比较常见的有:AVL树、伸展树(Splay Tree)、Treap树、红黑树(RB Tree)等。

参考:

Tim Roughgarden: Algorithms: Design and Analysis, Part 1 一线码农博客


Haiyang Xu 05 May 2014