C++ 如何旋转treap或AVL树?
很抱歉再次打扰你们,但我有一个问题,我已经好几天没自己解决了。 它是关于treap的旋转,例如,在pos处右旋转treap。 问题是如何将C++ 如何旋转treap或AVL树?,c++,algorithm,data-structures,avl-tree,C++,Algorithm,Data Structures,Avl Tree,很抱歉再次打扰你们,但我有一个问题,我已经好几天没自己解决了。 它是关于treap的旋转,例如,在pos处右旋转treap。 问题是如何将pos->left链接(或连接)到pos的原始父级? 我在网上找到了这段代码,它很有效,但我不知道它是如何解决我的问题的,是因为使用了*&?如果是的话,你能帮我解释一下吗? 那么pos=b的功能是什么这个代码是什么 void Treap::right_rotate(Node *&pos) { Node *b = pos->left;
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
的原始父对象)的人现在指向内存中的同一位置,但该值现在已替换为已旋转的子对象。顺便说一句,您在哪里找到代码?