如何旋转 treap 或 AVL 树
How to rotate a treap or AVL-tree?
很抱歉再次打扰你们,但我有一个问题,我已经好几天没有自己弄清楚了。它是关于 treap 的旋转,例如,在 pos 处向右旋转 treap。问题是如何将pos->left
链接(或连接)到pos
的原始父级?我在网上找到了这段代码,它有效,但我没有看到它如何解决我的问题,是因为使用了*&
吗?如果是这样,你能帮我解释一下吗?这段代码pos=b
的功能是什么?
void Treap::right_rotate(Node *&pos) {
Node *b = pos->left;
pos->left = b->right;
b->right = pos;
pos = b;
}
提前感谢!!
棘手的部分确实是*&
部分。这将它声明为对指针的引用(这里有一两个指向一些类似示例代码的链接,但我担心它们可能更令人困惑而不是有用)。
通过更改指针指向的节点 pos = b
,您可以将内容交换到不同的节点,而无需知道父节点。原始参照将更新为新的旋转节点。
这是一个图表,以防你需要对旋转的外观进行一些矫枉过正(尽管听起来你理解了那部分)。
初始条件:
Node *&pos;
|
[P]
/
L R
/ /
w x y z
然后存储左子项,因为就 P 而言,您将要覆盖它。
Node *b = pos->left;
pos->left = b->right;
|
L [P]
/ /
w x R
/
y z
现在我们完成旋转,因为 L 漂浮在空间中,破坏了正确的树结构:
b->right = pos;
L
/ |
w [P]
/
x R
/
y z
然后,我们将对节点指针的引用更新为替换内存中该位置内容的新节点来完成维护:
pos = b;
|
[L]
/
w P
/
x R
/
y z
以前指向pos
(pos
的原始父级)的人现在指向内存中的同一位置,但该值现在已替换为已旋转的子项。
相关文章:
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 使用非递归插入方法实现 AVL 树
- 从 AVL 树中删除指向 1 个或多个值的键
- 如何过滤avl树的数据
- 如何修复重新平衡时AVL删除操作中的分段错误?
- 如何在 c++ 中实现 avl 树,每个节点都是另一个 avl 树
- 按顺序遍历 AVL 树,将值保存在数组中
- AVL 树是否可以对不同节点中的键具有相同的值?
- 如何在这个哈希映射中实现 AVL 树
- 将文本文件单词插入 AVL
- 如何测试AVL树的自定义实现
- treap 中的轮换会违反它的堆排序或二叉搜索树顺序吗?
- AVL树C 的Ostream操作员
- AVL树插入方法导致分割故障
- AVL二进制树旋转和删除树的C 问题
- AVL 树旋转问题
- 按级别(C )打印AVL树级别
- 在 avl 树中实现删除过程
- 实现导致分段错误的 avl 树
- 如何旋转 treap 或 AVL 树