我想在不操纵其父N
的情况下向左旋转以节点P
为根的子树(参见左图)。
P P P
\ | \
N | R R
/ \ |/ /
L R N N
/ /
L L
如果我要在一个函数中使用N
作为参数:
void rotate_left(Node *node);
我最终将会看到中间人物上的一棵树。问题在于,尽管轮换P
仍指向N
,但仍未指向R
(左图)。如果函数P
没有指向R
的指针,如何在轮换结束时rotate_left()
指向P
?
我想到了三种方法:
让rotate_left()
引用指向节点N
void rotate_left(Node * &node);
然后拨打rotate left()
,传递给P
的正确孩子(即。{
N
):
rotate_left(P->right_child);
将对象R
放在N
的内存地址的末尾
旋转
将父P传递给rotate_left()
:
void rotate_left(Node *parent, Node *child);
解决方案(2)和(3)听起来不错,在解决方案(1)中,您需要知道调用P
的函数中的父rotate_left()
。
答案 0 :(得分:1)
解决方案1是您建议的三个中最好的。它或多或少等同于解决方案3.我会使用它。在我看来,无论你在哪里调用rotate_left
,你都已经知道存储这个指针的变量(父节点或root
),所以传递它的引用不会有问题
解决方案2(交换内容)将使树外已存在的任何指针无效。你必须非常小心;如果有这样的指示,不要使用它。但是,这是您问题的唯一真实答案"如何在不知道父母的情况下轮换?"。
我想你不想保留指向树中父节点的指针。如果您准备这样做,一切都会更容易。