我在网上找到了一些红黑树的代码,并正在尝试实现它。
我不想使用assert
原始代码位于此处的函数
n->color = child->color;
在删除修复之前,我在线路上遇到了段错误。调试后发现本例中不存在child,原来代码中assert语句的原因也是如此。我决定添加我认为合适的附加 if 子句,围绕从 child 向下处理的所有内容。
但是,现在程序实际上并没有删除,因为如果孩子不存在,它永远不会进入循环。经过反复试验,我仍然找不到关闭 if 子句以正确代替 assert 语句的位置。
请让我知道你的想法!
这是我的“翻译”代码,没有断言,而是使用 if 语句。
void delete_node(int key)
{
node* child;
node* n ;
n = searchTree(key);
if(n == NULL)return;
if(n->left != NULL && n->right != NULL)
{
node* pred = n->left;
while(pred->right != NULL)
pred = pred->right;
n->value = pred->value;
n = pred;
}
if(n->right != NULL || n->left != NULL){
child = n->right == NULL ? n->left : n->right;
if(n->color == 'b')
{
n->color = child->color;
delete_fix1(n);
}
swap_nodes(n, child);
if(n->parent == NULL && child != NULL)
child->color = 'b';
free(n);
}
}
测试数据(尝试删除时发生 Seg Fault 4):i 代表插入(据我所知,插入完美无缺) d 代表删除
i 7
i 8
i 1
d 8
i 4
i 10
d 4
i 11