如果文件树已满,请使用C删除它

如果文件树已满,请使用C删除它,c,tree,C,Tree,写一个C程序来删除一棵树 我写了一小段代码来实现这一点,但它进入了一个无限循环 void deleteTree(struct tnode *root) { cout<<root->data<<endl; if( root->lchild == NULL && root->rchild == NULL) delete(root); deleteTree(root->lchild); deleteTree(root-&g

写一个C程序来删除一棵树

我写了一小段代码来实现这一点,但它进入了一个无限循环

void deleteTree(struct tnode *root)
{
 cout<<root->data<<endl;
 if( root->lchild == NULL && root->rchild == NULL)
   delete(root);

 deleteTree(root->lchild);
 deleteTree(root->rchild);
 //return root;
}  

我想在遍历时删除它。我知道可以使用后序遍历。但是其他一些想法是否存在?

它不应该是无限循环,但它是不正确的,因为root->lchild可能为null,而当您删除treeroot lchild时,正确的子项不为null

无限循环?实际上,这应该是访问违规,也称为SIGSEGV。删除叶节点时,只需调用deleteroot,但不返回。因此,接下来的两个递归deleteTree调用仍在执行,从而导致SIGSEGV,因为root应该无效。要么加上退货;删除根目录后或使用以下命令:

void deleteTree(struct tnode *root)
{
  cout<<root->data<<endl;

  if (root->lchild != NULL)
    deleteTree(root->lchild);
  if (root->rchild != NULL)
    deleteTree(root->rchild);
  delete(root);
}

由于早期的子项检查,它还将保存一个函数调用。

提示:您真的应该调用deleteTreeroot->lchild;当没有留下的子项时,或删除TreeRoot->rchild;当没有合适的孩子时?你认为这和无限递归有什么关系


另外:您不应该先删除节点,然后再递归到其子节点中,因为节点被删除后,它就不存在了,而且您不能再真正使用root了,因为它对您起作用纯属运气。

您可能应该执行后序遍历,删除子节点,然后删除根节点。也许:

void deleteTree(struct tnode *root)
{
    if (root != NULL)
    {
        // ?? delete root->data ??
        deleteTree(root->lchild);
        deleteTree(root->rchild);
        delete root;
    }
}

如果希望在指针为null时避免递归调用,则可以在递归调用deleteTree之前测试每个子级是否为null。然后,您可以用断言替换现有的if测试,尽管当对deleteTree的初始调用被赋予空指针时,您必须担心被要求删除空树。

我只编写了一些小代码。我们可以假设我正在将根节点的地址传递给上面的函数。void deleteTreestruct tnode*root{if root==NULL return;deleteTreeroot->lchild;deleteTreeroot->rchild;deleteroot;}void deleteTreestruct tnode*root{if root==NULL返回;deleteTreeroot->lchild;deleteTreeroot->rchild;deleteroot;}我不明白我犯了什么错误。你能详细解释一下吗?莫,你不应该把完整的答案贴在家庭作业问题上。除此之外,这是一个很好的答案……对不起,我没有注意到家庭作业标签。我刚刚意识到它XD