试图在splay树中张开节点时的分割故障

Segmentation Fault when trying to splay a node in Splay tree

本文关键字:节点 分割 故障 张开 splay      更新时间:2023-10-16

我正在努力实现splay树。插入功能非常完美,但是当我尝试以锯齿形或锯齿形式的方式插入插入的节点时,我总是会遇到分割的故障。当要张开的节点没有祖父母时,使用的左右旋转效果很好。

这是右右Zig-Zig旋转的代码。如果我这样做,例如

insert("z", 1);
insert("j", 1);
insert("p", 1);
zigZigRotate(root.get_left().get_left());

我得到了J和P的无限环路。插入的第一个参数是关键,其次是等级(对于阶段遍历)。

因此,在上一个示例中,在张开之前,这棵树看起来像: z jp

由于z插入位置1,然后在位置1处插入j,将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将J作为其孩子之一。

看起来所有这些链接更改的操作顺序是不正确的,或者您需要在更改之前将其中一些链接存储在本地变量中。通过纸上工作。

n->get_parent()->set_parent(n);线更改n的祖父母。在此之后,n->get_parent()->get_parent()的电话将返回n。这可能会导致树上的回路。

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