首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >AVL树:如何进行索引访问?

AVL树:如何进行索引访问?
EN

Stack Overflow用户
提问于 2012-06-09 04:59:17
回答 1查看 4.7K关注 0票数 6

我在AVL Tree Wikipedia page上注意到了下面的评论:

如果每个节点另外记录其子树(包括其自身及其后代)的大小,则也可以在O(log n)时间内通过索引检索节点。

我在谷歌上搜索了一下,找到了一些提到accessing by index的地方,但似乎找不到一个人会写的算法的解释。

非常感谢

更新,谢谢大家。如果找到@templatetypedef答案,结合其中的@user448810 links来特别帮助。尤其是下面这段代码:

“这两个函数的关键是,节点的索引是它的左子节点的大小。只要我们通过树的左子节点向下移动,我们就只获取节点的索引。但当我们必须通过它的右子节点向下移动树时,我们必须调整大小,以包括我们已排除的树的一半。”

因为我的实现是不可变的,所以在重新平衡时我不需要做任何额外的工作,因为每个节点都会在构造时计算它的大小(与impl链接的方案相同)

我的最终实现是:

代码语言:javascript
代码运行次数:0
运行
复制
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();}
}

这与其他实现略有不同,如果您认为我有bug,请让我知道!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-09 05:04:35

这种构造背后的一般思想是采用现有的BST,并通过存储左子树中的节点数量来增加每个节点。完成此操作后,您可以使用以下递归算法查找树中的第n个节点:

  • 若要查找其根节点在左子树中具有k个元素的BST中的第n个元素,请执行以下操作:
    • 如果k= n,则返回根节点(因为这是树中的第0个节点)
    • 如果n≤k,则递归查找左侧的第n个元素在右侧BST中查找(n -k- 1)st元素

这需要时间O(h),其中h是树的高度。在AVL树中,这是O(log )。在CLRS中,这种结构被探索应用于红/黑树,他们将这种树称为“顺序统计树”。

您必须在树旋转期间添加一些额外的逻辑,以调整左子树中缓存的元素数量,但这并不是特别困难。

希望这能有所帮助!

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10955972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档