【问题标题】:BST pre-order deletionBST 预购删除
【发布时间】:2014-02-07 14:48:45
【问题描述】:

我想知道是否可以在预排序模式下释放整个二叉搜索树。我有这个功能:

void preorder_del(struct s_nodo ** tree)
{
     if (*tree != NULL)
        {
          free(*tree);
          preorder_del(&(*tree)->left);
          preorder_del(&(*tree)->right);
        }
}

我不认为这行得通,释放树的第一片叶子不会让我想起预订,对吧?

【问题讨论】:

  • 如果你释放节点,你指望tree->lefttree->right是什么明智的?

标签: c binary-search-tree preorder


【解决方案1】:

你应该在本地记录leftright以避免在free(*tree)之后访问被释放的指针。

 if (*tree != NULL)
 {
      struct s_nodo *l = (*tree)->left;
      struct s_nodo *r = (*tree)->right;
      free(*tree);
      preorder_del(&l);
      preorder_del(&r);
 }

【讨论】:

  • 它在我的 Mac 中不起作用。 “malloc:对象 0x9000000000000000 的 *** 错误:未分配被释放的指针”
  • @SebastianC 已编辑。我们不应该记录&(*tree)->left,因为它也被free(*tree)释放了。
  • free(*tree) 究竟是做什么的?删除所有的叶子,还是只删除指向的那一个?
  • 我不明白为什么我们要记录 &(*tree)->left,如果空闲就释放指向的叶子
  • (*tree)->left*tree 的一部分,因此存储它的内存空间在free(*tree) 时被释放。之后,访问(*tree)->left 会导致未定义的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多