本文的主要内容是 二叉搜索树 (binary search trees,以下简称 BST)以及其相关的 API 操作介绍。
注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。
定义:BST是对称顺序的二叉树。
二叉树要么为空, 要么由两个不相交的二叉树组成(即左子树和右子树)。
进一步理解(有点绕):
二叉树是一种显式数据结构(显式树结构),与之相对应的,堆是一种隐式数据结构(用数组隐式表示树)。
对称顺序。每个节点都有一个键(key),并且每个节点的键都满足以下条件:
- 大于其左子树中所有节点的键。
- 小于其右子树中所有节点的键。
进一步理解:
一个二叉搜索树(BST)是一个指向根节点的引用。
一个节点由四个部分组成:
edu.princeton.cs.algs4.BST
查找:如果更小,向左移动;如果更大,向右移动;如果相等,搜索命中。
搜索 H:
初始状态:
与根节点 S 比较(更小),左移:
与节点 S 左子树节点 E 比较(更大),右移:
与节点 E 右子树节点 R 比较(更小),左移:
与节点 R 左子树节点 H 比较(相等),搜索命中:
搜索 G:
初始状态:
与根节点 S 比较(更小),左移:
与节点 S 左子树节点 E 比较(更大),右移:
与节点 E 右子树节点 R 比较(更小),左移:
与节点 R 左子树节点 H 比较(更小),左移:
H 左移为空链接,查找未命中(并返回 null):
插入:如果更小,向左移动;如果更大,向右移动;如果为 null,插入。
插入 G:
初始状态:
移动路径与 #1.5.2
查找类似,直到节点 H 左子树为 null,插入节点 G:
G 完整移动路线图:
edu.princeton.cs.algs4.BST#get
开销:
一次结束于给定结点的命中查找所需的比较次数为查找路径的深度加1。
edu.princeton.cs.algs4.BST#put
注:树的形状取决于键被插入的先后顺序。
命题C。在由N个随机键构造的二叉查找树中,查找命中平均所需的比较次数为~2lnN(约1.39lgN)。
命题D。在由N个随机键构造的二叉查找树中插入操作和查找未命中平均所需的比较次数为~2lnN(约1.39lgN)。
书里面在章节末尾也有给出相关的表格:
表3.2.2 简单的符号表实现的成本总结
Now,we’re going to take a look at ordered symbol table operations using the binary search tree data structure as the underlying implementation.
现在,我们将要探讨如何利用二叉搜索树这一数据结构作为底层实现,来进行有序符号表操作。
相关的所有章节:
Minimum and maximum.
Floor and ceiling.
Selection.
Rank.
图3.2.10 计算floor()函数
edu.princeton.cs.algs4.BST#floor
相关的所有章节:
Delete the minimum and maximum.
Delete.
Range search.
图3.2.12 删除二叉查找树中的最小结点
edu.princeton.cs.algs4.BST#deleteMin
情况一:没有子节点
情况二:一个子节点
情况三:两个子节点
书中关于删除过程操作的描述:
图3.2.13 二叉查找树中的删除操作
edu.princeton.cs.algs4.BST#delete
简单汉化一下:
不能令人满意的结果:不对称。
令人惊讶的事实:树不再随机 => 平方操作
长期存在的开放问题:简单高效的 BST 删除。
That’s another one like merging in place, that you’d think there ought to be an easy way to do it, but in 50 years, no one’s really discovered one.
这是另一种类似原地归并的方法,你会认为应该有一种简单的方法可以做到这一点,但 50 年来,没有人真正找到解决方法。
下一节:红黑二叉搜索树(Red-black BST):保证所有操作的对数性能。
But the delete operation for Binary Search Trees shows us the kind of complexity that we can encounter with working with these kinds of data structures.
BST 删除操作向我们展示了当遇到类似数据结构时我们可能遇到的复杂情况。
(完)