假设我有一个不同整数的AVL树。我需要确定位于区间[a,b)中的节点数量,其中a<湾注意,[a,b)由用户提供,因此我事先不知道a和b的值是什么。此外,a和b可能根本不存在于树中。例如,如果我有一个包含整数{1,2,4,5,6,7}的树,那么如果用户提供间隔[3,7],则用户应该期望得到3。
一个简单的实现是遍历每个节点,并在每次在给定间隔中找到节点时将计数增加1。但是这将具有O(n)的最坏情况时间复杂度,因为树中的每个单个整数都可能在给定范围内。我需要一个更快的算法,并且在做了一些研究之后我发现它需要在每个节点中存储大小统计量,以便可以容易地计算任何给定节点的秩。
我想做排名(b) - 排名(a),但问题是a和b可能不存在于树中。在上面的例子中,rank(7)将返回6,但rank(3)将不返回任何有意义的值。
有人可以就如何解决这个问题提出建议吗?另外,我知道在这个网站上还有另一个类似的问题,但是这个问题涉及C ++,而这个问题涉及Java。而且,我在那里找不到满意的答案。
答案 0 :(得分:0)
而不是
rank(b) - rank(a)
我会做的是
rank(X) - rank(Y)
X是第一个具有值>的节点。湾
Y是第一个具有值> = a。
的节点答案 1 :(得分:0)
我在很久以前为AVL树实现了一个基于堆栈的树迭代器。它应该适用于你的情况:
您现在已经是一个路径,而不是您的treestack,您可以将其用于后续的有序遍历,以查找下一个更高的值。使用堆栈的顺序遍历如下:
我希望它有所帮助。