有没有办法在平衡二进制搜索树中找到2个给定节点之间的节点数(仅计数),使用它们在< O(log n)时间?
我们可以假设我们已经将每个Node的等级(或高度)动态地存储为Node类的成员变量。所以,我们可以直接访问它。
答案 0 :(得分:2)
是的,使用lowest common ancestor查询可以在恒定时间内计算其间的节点。它需要在线性时间内对树进行一次预处理。
如果您知道两个节点的最低共同祖先的等级,那么您可以通过从子节点的等级中减去祖先的等级来计算节点与祖先之间的节点数。
nodes_between = a.rank + b.rank - 2*(lowest_common_ancestor(a, b).rank) + 1
以上将返回节点a
和b
之间路径的长度,包括两个端点。 + 1
用于最低共同祖先。查找lowest_common_ancestor
可以在恒定时间内完成,计算是恒定时间。