【问题标题】:Deleting target with two children删除有两个孩子的目标
【发布时间】:2015-02-03 23:10:50
【问题描述】:

有人介意简要解释一下为什么我不断从这段代码中得到分段错误吗?

"target" 是要删除的节点,我试图用左分支上最右边的叶子替换它。 "parent" 是目标的父级。

    else if (target->left != NULL && target->right != NULL) {
      Node * childishDad = target;
      Node * childish = target->left;

      while(childish->right != NULL){
        childishDad = childish;
        childish = childish->right;
      }
      if(parent->left == target)
        parent->left = childish;

      if(parent->right == target)
        parent->right = childish;

      childish->left = target->left;
      childish->right = target->right;

      if(childishDad != target)
        childishDad->right = NULL;

      delete target;
      return true;
    }

【问题讨论】:

  • 早期,您尝试访问childish->right。你确定childish 不是NULL 吗?您的调试器是否向您显示了您的段错误在哪一行?
  • @DrewDormann +1 表示“您的调试器是否向您显示了您的段错误在哪一行?”
  • @DrewDormann,childish 不能是 NULL。在分配之前,所有对幼稚的分配都经过NULL 测试。
  • 感谢您的帮助。我意识到我没有检查是否parent == NULL,所以在我试图删除根节点的情况下它失败了。

标签: c++ c pointers binary-tree binary-search-tree


【解决方案1】:

当while循环完成时,你知道

childish->right == NULL

但是,稍后您分配

childish->right = target->right;

也许这就是问题所在。

【讨论】:

    【解决方案2】:

    我意识到我没有检查 parent == NULL 是否,所以在我尝试删除根节点的情况下它失败了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多