gpt4 book ai didi

c - 删除二叉树中仅通过引用传递节点的节点

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:38:27 24 4
gpt4 key购买 nike

我正在尝试删除一个二叉树,我的程序工作如下:

(1) 读取树中要创建的节点数。

(2) 它读取所有这些节点。

(3) 它打印由这些节点形成的树。

(4) 在终端读取要删除的节点。

直到这里一切正常,但是当我尝试删除所需的节点时,它会出现段错误。

注意:我必须仅通过引用传递根(这就是为什么我在 delete_tree_node(int delete_val, node **root) 中为根保留了两个指针)。

我这样做的方法是:我通过左右 child 递归调用函数 delete_tree_node() 以遍历树,直到我得到节点的值等于用户要删除的节点的值。一旦我得到那个地方,我就 free()那个节点。

我实现这个的代码是:(它给出了分段问题):

delete_tree_node(int delete_val, node  **root)//two "**" because i call by reference in function call    
{
node*temp1;
temp1=(*root);
if(delete_val==(*root)->freq)
{
free((*root));
temp1=temp1->left;
(*root)=temp1;
}

if(delete_val<temp1->freq)
{
delete_tree_node(delete_val,&temp1->left);
}
if(delete_val>temp1->freq)
{
delete_tree_node(delete_val,&temp1->right);
}
}

它的函数调用是:

delete_tree_node(delete_val, & head);//I give reference

谁能帮我知道:

(1)为什么会报segmentation error.

(2) 我删除节点的逻辑是否正确?如果不正确,请给我一段代码作为引用?

最佳答案

Why it gives segmentation fault?

因为在尝试访问 temp1->left 中的相同内存之前,您释放了 *root 指向的内存。

让我们仔细看看:-

temp1 = (*root)

temp1 现在拥有与 (*root) 相同的内存地址,即两者都是指向相同地址的一些数字。为了清楚起见,我们假设该数字为“6”。因此,它们都指向内存地址“6”。请注意,它们不等于该地址的值,而只是指向该地址。

现在,free((*root)); 告诉系统您正在释放 (*root) 指向的内存位置,在本例中为 6。一旦释放了内存,您失去了对该内存的访问权限,下次您请求它时(通过 temp1->left),您会遇到段错误。

我希望澄清导致段错误的原因。

粗略一瞥告诉我,您可以通过在最后释放 (*root) 来解决这个问题。事实上,递归调用会更清楚,因为你可以通过这个伪代码来描述它:-

delete left subtree
delete right subtree
delete root

我不会深入研究逻辑的正确性,因为这似乎是一个家庭作业问题,建议您自己解决该部分。

关于c - 删除二叉树中仅通过引用传递节点的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22146006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com