试图在splay树中张开节点时的分割故障
Segmentation Fault when trying to splay a node in Splay tree
我正在努力实现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()
是一种类型,带有->
而不是比较。)
相关文章:
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 如何在C++中从字符串中分割字符
- C++映射分割错误(核心转储)
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- 如何找到2个单链表的公共节点
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++为线程工作动态地分割例程
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 如何在pugixml中获取节点的内部XML
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- C ,二进制树的高度,而不是检查我的子树是否为空,而是在检查我的子树是否是叶子节点.抛出分割故障
- 试图在splay树中张开节点时的分割故障
- 试图从链接列表中删除节点后的分割故障
- 删除节点时的分割故障
- 分割错误:11与节点做任何事情
- b树节点分割技术