【问题标题】:BST segmentation fault when deleting the root node删除根节点时出现 BST 分段错误
【发布时间】:2021-09-18 03:57:44
【问题描述】:

我目前正在尝试实现 BST,但在尝试实现删除功能时遇到了麻烦。当它试图删除的节点是根节点时,该函数会给出段错误。删除根节点以外的节点似乎不会导致此问题。有什么帮助吗?

bool bst::del(int num) { //return if successfully deleted a node
  treenode *del_node = root;
  treenode *par_node = NULL;
  while (del_node) {
    if (del_node->key == num) break;
    par_node = del_node;
    (del_node->key > num)?
    del_node = del_node->lsub:
    del_node = del_node->rsub;
  }

  //node not found
  if (!del_node) return 0;

  //2 children
  if (del_node->lsub && del_node->rsub) { 
    //swap to deleting replacement
    //replace = max in lsub || min in rsub
    treenode *replace = del_node->lsub;
    while (replace->rsub) {
      par_node = replace;
      replace = replace->rsub;
    }
    *del_node = *replace;
    del_node = replace;
  }

  //0 child
  if (!del_node->lsub && !del_node->rsub) { 
    (par_node->key > num)?
    par_node->lsub = NULL:
    par_node->rsub = NULL;
  }

  //1 child
  else if (del_node->lsub) {
    (par_node->key > num)?
    par_node->lsub = del_node->lsub:
    par_node->rsub = del_node->lsub;
  } else {
    (par_node->key > num)?
    par_node->lsub = del_node->rsub:
    par_node->rsub = del_node->rsub;
  }
  delete del_node;
  return 1;
}```

【问题讨论】:

    标签: c++ data-structures


    【解决方案1】:

    如果您删除的节点是根节点,您将需要添加条件测试。如果是这种情况,则需要将根指针重新分配给替换根的节点。

    如果没有这一步,您将创建一个导致您的段错误的悬空指针。

    【讨论】:

      猜你喜欢
      • 2019-03-03
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 2021-10-23
      • 1970-01-01
      • 2017-10-28
      相关资源
      最近更新 更多