我正在实现一个展开树。插入效果很好,但是当我尝试以之字形或之字形方式张开插入的节点时,我总是会遇到分段错误。当要展开的节点没有祖父母时使用左右旋转,效果很好。
这是右曲之字形旋转的代码。如果我这样做,例如
insert("z", 1);
insert("j", 1);
insert("p", 1);
zigZigRotate(root.get_left().get_left());
我得到了 j 和 p 的无限循环。insert 的第一个参数是 key,第二个是 rank(用于按顺序遍历)。
因此,在前面的示例中,在展开之前,树看起来像: z j p
由于 z 插入位置 1,因此 j 插入位置 1,将 z 移动到位置 2,依此类推。
这是我用于右转的 zig-zig 代码。
if (n == n->get_parent()->get_left())
{
if (n->get_right() != nullptr)
{
n->get_right()->set_parent(n->get_parent());
}
if (n->get_parent()->get_right() != nullptr)
{
n->get_parent()->get_right()->set_parent(n->get_parent()>get_parent());
}
n->get_parent()->get_parent()->set_parent(n->get_parent());
n->get_parent()->set_parent(n);
n->get_parent()->get_parent()->set_left(n->get_parent()->get_right());
n->get_parent()->set_right(n->get_parent()->get_parent());
n->get_parent()->set_left(n->get_right());
n->set_right(n->get_parent());
n->set_parent(n->get_parent()->get_parent()->get_parent());
}
我已经追踪了它,它似乎应该正确地旋转给我。不应该发生无限循环的地方。但既然是这样,我会假设 j 和 p 以某种不应该的方式连接在一起。比如 j 有 p 作为它的左孩子,但是 p 由于某种原因有 j 作为它的一个孩子。