最近在学习coursera上的算法4,讲的确实很精彩,2d-tree的实现是基于二叉查找树(BST),但是其中有有很多小的tricks需要与大家分享。
需要注意的是在node数据结构的选取上:
private Point2D point;
private Node left;
private Node right;
private boolean flag;
private RectHV rect;
前三个理所当然是链表必备要素,后面flag和rect则是为了方便实现range search和nearest point search所添加,rect为node节点所占据的空间,flag表明当前节点是以x还是y划分。
range search的实现基于以下原理:
首先判断需要搜索的矩形rect是否与root所占据的空间有交集,如果有,判断root是否在rect中,然后向下搜索。
nearest point 的实现
nearest的实现比较好玩,利用二叉树的深度优先搜索配合剪枝!
首先判断目标节点与root所占据空间的最短距离dist是否比best大,如果dist>best,则剪枝。贴出伪代码供大家学习
再给出java实现的代码
package kd