BST 中的隔离错误迭代插入
Segfault-Iterative insert in BST
我正在尝试编写代码以迭代方式在BST中插入新元素。当我尝试执行代码时,出现段错误。有人可以查看代码并帮助我更正吗?
bool insert2(int item)
{
BstNode *parent;
BstNode *root=new BstNode;
cout<<root->data;
cout<<"n";
BstNode *ptr;
int ctr=0;
//cout<<root->data;
if (root==NULL)
{
BstNode *temp=new BstNode;
temp->data=item;
temp->left=NULL;
temp->right=NULL;
root=temp;
//cout<<root->data;
return true;
}
else
{
ptr=root;
while (ptr!=NULL)
{
ctr=ctr+1;
cout<<ctr;
if (ptr->data==item)
{
cout<<ptr->data;
return false;
}
if (item < ptr->data)
{
parent=ptr;
ptr=ptr->left;
}
else
{
parent=ptr;
ptr=ptr->right;
}
}
BstNode *add=new BstNode;
add->data = item;
add->left= NULL;
add->right= NULL;
return true;
}
}
在编辑根>数据部分时,代码将进入第一个 if 块并返回 true,这让我猜测我的问题出在减速的某个地方。
你做错了很多事情。 首先,正如PaulMcKenzie所指出的,你不应该在函数的开头创建根。 如果 BST 开始时不为空,则根已经存在,您不想创建一个新根。 相反,根应该是一个公共变量(这只允许你有一个BST),或者函数应该将指向根的指针作为参数之一。 创建根,然后测试它以查看它是否为 NULL,这当然是没有意义的。 除非内存不足,否则在创建后它不会立即为 NULL。
代码的另一个问题是,在 BST 中找到适当的位置后,创建新节点,但不将其附加到树。 相反,您可能希望在初始化add
后插入以下行:
if(item < parent->data)
parent->left = add;
else
parent->right = add;
至于每次调用函数时都出现段错误的事实,可能是因为当您声明 root
时,您没有初始化其right
并left
指向 NULL 的指针。因此,while 循环在达到 root->left
或 root->right
时不会停止。 当您尝试稍后在循环中顺从ptr
时,您将引用未初始化的指针,从而导致段错误。
相关文章:
- 列表的有效性在插入后开始迭代器
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++ 向量插入和迭代器混淆
- 在插入容器之前转换输出迭代器
- 如何将元素插入和迭代到这种映射.C++
- 插入 boost::multi_index 后迭代器变得无效?
- unordered_set范围插入与迭代器
- 如果迭代器没有因插入而无效,则使用std::find和C::insert()是线程安全的
- 使用条件迭代器插入到向量中
- 向量<pointer>:插入(迭代器,指针)插入垃圾值
- 并行STL插入迭代器,例如std :: back_insert_iterator
- unordered_map在结束迭代器上插入
- 重新插入元素可以"re-validate"迭代器吗?
- C 无法在列表上的迭代后使用插入物来附加值
- 插入新元素时结束迭代器会获得更新
- 如何通过迭代通过它插入数组范围
- BST 中的隔离错误迭代插入
- 二进制搜索树递归插入导致堆栈溢出,迭代插入不起作用
- 通过链表迭代插入STL向量值
- c++迭代插入到二叉搜索树BST