【发布时间】:2012-06-12 22:24:25
【问题描述】:
我在AVL Tree Wikipedia page 上注意到以下评论:
“如果每个节点都额外记录了它的子树的大小(包括它自己和它的后代),那么这些节点也可以在O(log n)时间内通过索引来检索。”
我已经用谷歌搜索并找到了一些提到accessing by index 的地方,但似乎无法找到一个人会写的算法的解释。
非常感谢
[更新] 谢谢大家。如果发现 @templatetypedef 答案与 @user448810 links 之一结合起来特别有帮助。尤其是这个片段:
"这两个函数的关键是一个节点的索引是它的左孩子的大小。只要我们通过它的左孩子降序一棵树,我们只取节点的索引。但是当我们必须通过它的右子树向下移动,我们必须调整大小以包括我们排除的树的一半。”
因为我的实现是不可变的,所以在重新平衡时我不需要做任何额外的工作,因为每个节点都会在构造时计算它的大小(与 impl 链接的方案相同)
我的最终实现是:
class Node<K,V> implements AVLTree<K,V> { ...
public V index(int i) {
if (left.size() == i) return value;
if (i < left.size()) return left.index(i);
return right.index(i - left.size() - 1);
}
}
class Empty<K,V> implements AVLTree<K,V> { ...
public V index(int i) { throw new IndexOutOfBoundsException();}
}
这与其他实现略有不同,如果您认为我有错误,请告诉我!
【问题讨论】:
标签: algorithm data-structures tree indexing avl-tree