【问题标题】:Segmentation Fault in binary search insertion c++ [closed]二进制搜索插入c ++中的分段错误[关闭]
【发布时间】:2015-08-07 10:32:09
【问题描述】:

在二叉搜索树中插入值时给出了分段错误。 这是hackerrank问题所以只有这个方法必须写 这是我写的

typedef struct node
{
 int data;
 node * left;
 node * right;
}node;

node * insert(node * root, int value)
{
 node* temp = root;
 node* temp1 = new node();
 node* prev = NULL ;
 while(temp != NULL){
    prev= temp;

      if(value >= temp->data)
        temp = temp->right;
      else
        temp = temp->left;
  }
  temp1->data = value;
  temp1->left = NULL;
  temp1->right = NULL;
  if(prev->data >= value)
    prev->left = temp1;
  else
    prev->right = temp1;
 return root;
}

我不明白为什么这段代码会给我分段错误。

欢迎所有建议..

【问题讨论】:

  • 这应该标记为 C,而不是 C++
  • @kebs 因为new 是一个有效的 c 关键字。
  • @Suraj Palwe:请包括所有相关代码,而不仅仅是一个 sn-p。
  • @Mark Jansen 哎呀,对不起,错过了!我这么说是因为typedef struct ... 有强烈的C 气味。
  • @MarkJansen 这是黑客等级问题,我只需要写这个方法!!

标签: c++ c segmentation-fault binary-search-tree


【解决方案1】:

如果可以使用递归使代码变得更简单,则无需使代码复杂。

node * insert(node * root, int value)
{
 if(root==NULL)
 {
  root=new node;
  root->data=value;
  root->left=NULL;
  root->right=NULL;
  return root;
 }
 else if(root->data>value)
 {
  root->left=insert(root->left,value);
  return root;
 }
 else 
 {
  root->right=insert(root->right,value);
  return root;
 }    
}

【讨论】:

  • if 子句以return 结尾之后不需要else。如果你放下第一个else,你可以将第二个和第三个return移到if–else之外。
  • 感谢递归,这似乎是解决问题的好方法
  • 与循环相比,函数调用非常昂贵,并且 BST 可以变得非常高。如果你想走递归路线,请确保它是tail recursive。我不认为这个实现是尾递归的。
  • @anonymouscoward 不,不是。但它可以通过使用指向指针的指针来实现,比如struct node** nest,它被初始化为nest = &root,然后通过nest = &((*nest)->left);nest = &((*nest)->right); 向下滑动树。一旦你找到*nest == NULL,你就会在*nest = MakeNewNode(str);那里嫁接一片新叶子
【解决方案2】:

您没有检查root == NULL

【讨论】:

  • 谢谢我认为该列表将始终包含数据..我的错(:
  • @SurajPalwe 动态结构通常在第一次插入之前没有数据...当然,您可以在创建结构时预先分配一些数据(例如,列表可能有一个“头”节点,而不是只是一个头指针,而树可能有一个根节点,默认情况下“小于”所有后续添加的节点),但通常它们在开始时确实是空的。所以一般来说,如果指针来自某个外部世界,在使用它之前总是测试它是否有效(除非调用者保证指针总是有效的)。
  • 感谢您提供详细的帮助说明。 ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 2020-01-31
相关资源
最近更新 更多