本文有一只奶龙编写,有借鉴会在其中说明。
平衡树
要了解平衡树是什么,我们需要先了解一个东西:二叉搜索树(也称二叉查找树)。
-
二叉搜索/查找树(BST)
如果我们有一颗二叉树可以进行查找,那么就可以说明其中的节点一定又有一个能够区分大小的“键值”。我们有节点来存储这些键值。这些节点最好可以按照它们各自的键值来进行排序(按照好坏优劣),这样才可以在这棵树上面进行高效且快速的查找,于是一个名词就这样诞生了:二叉搜索/查找树(Binary Search Tree,俗称 BST)。
我们现在来分析一下 BST 的一些特征,知道这些我们才可以来了解平衡树。
-
BST 的特征
我们可以发现,BST 具有以下特征:
-
BST 中的每一个节点都只有唯一的键值,且这些键值可以按照好坏优劣来区分它们的大小。
-
在 BST 上,以任意一个节点作为一棵子树的根,那么这棵子树一定也是一颗 BST(当然,这是显然的)。任何节点的键值都比它的左边的节点的键值要大一些,自然,任何节点的键值都比它的右边的节点的键值要小一些。可以发现,承载最大的键值的节点没有右节点,因为右节点需要大于根节点。
那我们可以来用图片来理解一下:
比如这就是一颗标准的 BST,其中我们可以发现的是,如果对于特征 2,那么使用中序遍历就可以得到了一个有序的排列(中序遍历:先遍历左子树,然后是根,然后是右子树)。
如图所示,那么我们得到的序列应该是 \([1, 2, 3, 4, 5 , 6]\)。
通过虚线可能会更加清楚:
如图所示,我们在图上画了一些虚线,把每一个节点都隔开,这是可以发现,树上的节点正好按照从小到大的顺序被虚线所隔开,刚好形成了一个有序的序列。到后面,有了这些虚线的帮助,我们可以跟好的去理解 Treap 和 Splay 树中“旋转”的操作技术。
既然都是二叉查找树了,那么我们在 BST 查找一个数,查找的次数其实就是这颗二叉搜索的树的深度。我们来举个例子,我们现在需要来查找 \(3\) 这个节点,从根节点开始,沿着 4->2->3
的顺序查找两次就确定了。我们在建立一颗二叉查找树的时候,如果每一层差不多都是满的节点,那么此时的 BST 的层次是最少的,此时,才能最好的展现 BST 的威力。
-
BST 的形态