-4

我正在实现一个展开树。插入效果很好,但是当我尝试以之字形或之字形方式张开插入的节点时,我总是会遇到分段错误。当要展开的节点没有祖父母时使用左右旋转,效果很好。

这是右曲之字形旋转的代码。如果我这样做,例如

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 作为它的一个孩子。

4

1 回答 1

1

看起来所有这些链接更改的操作顺序不正确,或者您需要在进行更改之前将其中一些链接存储在局部变量中。把它写在纸上。

n->get_parent()->set_parent(n);行更改n的祖父母。之后,调用n->get_parent()->get_parent()将返回n。这可能会导致树中出现循环。

(我假设这n->get_parent()>get_parent()是一种类型,->目的而不是比较。)

于 2017-02-19T03:03:58.340 回答