algorithm - 通过序号索引访问红黑树

标签 algorithm binary-tree complexity-theory red-black-tree

我有一棵红黑树(二叉树,所有的叶子都在2层以内)。 我可以通过节点导航:向左、向右或父节点。 我知道节点的全部数量。

我必须找到树中第 N 个最小的元素。有什么方法比 O(n) 更快?通过索引优化访问的任何想法?

最佳答案

在每个节点 X 中,您应该存储以 X 为根的子树中有多少个节点。

count(LEAF) = 1
count(NODE) = count(NODE->LEFT) + count(NODE->RIGHT) + 1

在每次插入/删除期间,您应该使用此等式来更新受旋转影响的节点中的计数。

解决之后就很简单了

NODE nth(NODE root, int n) {
    if (root->left->count <= n) return nth(root->left, n);
    if ( root->left->count + 1 == n) return root;
    return nth(root->right, n - root->left->count - 1);
}

关于algorithm - 通过序号索引访问红黑树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9953557/

相关文章:

algorithm - 放气算法伪代码

algorithm - 这是什么类似的背包?组建最佳团队

algorithm - 从 'n' 不同数字的组合中生成一个唯一数字?

algorithm - 惯用遍历二叉树(可能是任何树)

algorithm - 如何构建仅知道连接哪些节点的二叉树?

algorithm - 探戈树有实际应用吗?

python - 从 python 中的字典列表中提取子字典的更有效方法是什么?

java - 二叉树节点计数的递归方法

algorithm - {0,1} 上的序列数,使得序列至少包含一半的

database - 在文本中突出显示上下文关键字链接