我正在实施splay树。插入工作完美,但是当我尝试以锯齿形或锯齿形的方式展现插入的节点时,我总会遇到分段错误。当节点被展开时没有祖父母时使用的左右旋转完美地起作用。尝试在播放树中展开节点时出现分段错误
下面是右右锯齿形旋转的代码。如果我这样做,例如
insert("z", 1);
insert("j", 1);
insert("p", 1);
zigZigRotate(root.get_left().get_left());
我得到一个无限循环的j和p。插入的第一个参数是关键,第二个参数是排序(为了遍历)。
所以,在前面的例子中,张开之前,树将如下所示: ž Ĵ 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作为其孩子之一。
感谢。我甚至没有注意到这个错字,而你的其他解释也很合理。 – Severage