我找到的唯一合理的幻灯片集是this,在第 15 页中说,用于构建:
- 将所有点按其 x 坐标值排序,并将它们存储在平衡二叉树(即范围树)的叶节点中
- 从根开始,每个节点都包含其子树中的点,其 y 坐标的最大值尚未存储
在树中较浅的深度;如果不存在这样的节点,则节点
为空
我之前实现了一个范围树,所以根据我在那里使用的示例,我现在有(对于优先搜索树):
7
------ 0 ---------------------
| |
6 6
---- -3 ---- ---- 4 ------
| | | |
4 2 1 3
---- -4 - -2 --- 3 --- 5
| | / \ | | / \
0 (-3,4) (-2,2)(0,7) NIL (4,-4) (5,3)(6,-1)
-5 2
/ \ / \
(-5,6) (-4,0) (2,1) (3,6)
在这里,每个内部节点都具有以下形式:
mid_x
max y
我提出的范围查询是(-inf,1)x(-0.5,5),即(x_low,x_high)x(y_low,y_high)。
- 所以,让我们从根开始,我检查 x (=0) 是否在 (-inf, 1) 中,如果 7 > (-0.5, 5)。是的,因此我在两个孩子中进行,但为简单起见,让我跟随左边的孩子(从现在开始)。
- 我检查 -3 是否是 x 范围,以及 6 是否大于或等于查询的 y 范围的上限(即 5)。是的,所以我继续。
- 下一层也一样,因此我们进入下一层,现在请关注这个内部节点。它有 as max ya 0,表示子树的最大 y 为 0,这是不正确的(左孩子为 (-5, 6)) *。
我在构建/搜索过程中缺少什么?
换句话说:
检查树的最左边的分支;它的max_y
值(引用中的第 2 个项目符号)为 7、6、4、0。
但是那个值不是表示存储在内部节点下的子树中的最大 y 值吗?0
如果是这样,这对于和点不成立(-5, 6)
(不使用 6,因为它用于第 2 级)。
*我提出的特定查询可能不会因此而受损,但另一个可以。