C++ 分段故障(核心转储)-线程二叉搜索树
我不断得到以下错误:分段错误(核心转储)。我找到了导致问题的代码行(在程序内部用注释标记)。请告诉我发生此错误的原因以及如何修复它 我已经试着(在纸上)干运行我的代码,并且没有看到任何逻辑错误(据我所知)。C++ 分段故障(核心转储)-线程二叉搜索树,c++,binary-tree,binary-search-tree,C++,Binary Tree,Binary Search Tree,我不断得到以下错误:分段错误(核心转储)。我找到了导致问题的代码行(在程序内部用注释标记)。请告诉我发生此错误的原因以及如何修复它 我已经试着(在纸上)干运行我的代码,并且没有看到任何逻辑错误(据我所知)。 我最近才开始学习编码和stackoverflow,请指导我如何进一步改进我的问题和代码。谢谢 类树 { 结构节点//为树创建一个节点 { int数据; bool rbit,lbit;//rbit/lbit=定义根的右/左子级是否存在 节点*左,*右; }; 公众: 节点*头,*根; tree
我最近才开始学习编码和stackoverflow,请指导我如何进一步改进我的问题和代码。谢谢
类树
{
结构节点//为树创建一个节点
{
int数据;
bool rbit,lbit;//rbit/lbit=定义根的右/左子级是否存在
节点*左,*右;
};
公众:
节点*头,*根;
tree()//构造函数初始化根和头
{
root=NULL;
head=createnode(10000);
}
节点*createnode(int值)
{//为节点分配内存,然后使用给定值初始化节点并返回该节点
node*temp=新节点;
温度->数据=值;
温度->lbit=0;
温度->rbit=0;
temp->left=NULL;
temp->right=NULL;
返回温度;
}
void insert(node*temp,int值)//逐节点创建二进制搜索树
{
if(root==NULL)//检查树是否为空
{
root=createnode(value);//root现在指向新的内存位置
头部->左侧=根部;
头部->lbit=1;
root->left=head;//这一行给出了分段错误(我在更正之前的想法)
}
}
void inoorder(node*root)//树的inorder遍历(此函数在逻辑上不正确)
{
if(root==NULL)
返回;
顺序(根->左);
cout没有足够的信息确切说明这应该如何工作(例如,node.lbit
)
问题的insert()
函数将不起作用。它正在传递一个立即被覆盖的值(以及其他问题)。没有解释tree.head
的用途,因此它被忽略。字段node.lbit
和node.rbit
看起来是node.left!=NULL的多余标志(右图类似)。这些也被省略。insert()
也没有正确创建树
void insert(int value) // Insert a value into the tree (at branch)
{
// Create a new node to insert
struct node *temp = createnode(value);
if (root == NULL) // Checking if tree is empty
{
root = temp; //Root now points to temp
}
else
{
insertAtBranch(root, temp);
}
}
// recursively find the leaf-node at which to insert the new node
void insertAtBranch(node *branch, node *new_node)
{
// to create a BST, less-than go left
if (new_node->value <= branch->value)
{
if (branch->left == NULL)
branch->left = new_node; // There's no left-branch, so it's the node
else
insertAtBranch(branch->left, new_node); // go deeper to find insertion point
}
else // greater-than go right
{
if (branch->right == NULL)
branch->right = new_node;
else
insertAtBranch(branch->right, new_node);
}
}
void insert(int-value)//在树中插入一个值(在分支处)
{
//创建要插入的新节点
结构节点*temp=createnode(值);
if(root==NULL)//检查树是否为空
{
root=temp;//root现在指向temp
}
其他的
{
插入分支(根,温度);
}
}
//递归查找要插入新节点的叶节点
无效插入分支(节点*分支,节点*新节点)
{
//要创建一个BST,请小于向左
如果(新建节点->值)
{
如果(分支->左==NULL)
branch->left=new_node;//没有左分支,所以它是节点
其他的
InsertBranch(分支->左,新节点);//深入查找插入点
}
否则//比右转大
{
如果(分支->右==NULL)
分支->右=新建_节点;
其他的
InsertBranch(分支->右侧,新节点);
}
}
想象一下二叉树是如何工作的。新节点只会插入到边上。因此,您可以查看给定节点,并确定此新节点是否比您正在查看的节点小或大(当然,除非树是空的)
假设新节点.value
小于分支节点.value
,则要向左分支。仍然使用相同的节点,如果没有左分支(node.left==NULL)
,则新节点为左分支。否则,需要沿着左分支向下移动并再次检查
我会将节点
设置为一个类,并使用构造函数至少设置默认属性和值
。但这并不是什么大问题。我认为注释部分在很大程度上反映了沟通错误。很容易相信,您在这一行上遇到了崩溃
实际情况并非如此。相反,您所做的是在树中创建一个循环,该循环通过inoorder
函数导致无限递归。这会导致堆栈溢出,从而导致segfults——如果您只是在附加了调试器(如gdb)的情况下运行程序,则很容易发现这一点
temp = createnode(value);
if(root == NULL)
{
root = temp;
head->left = root;
head->lbit = 1;
temp->left = head;
}
看看您刚刚创建的循环:
head->left points to root
root->left == temp->left, which points to head
顺序遍历现在将访问:
root
head
root
head
root
head
...
因为它永远不会到达左分支的末尾,所以函数在溢出堆栈并崩溃之前从不输出任何内容
因此,不,您的代码在逻辑上不正确。它有一个基本的设计缺陷。您需要重新思考您在树中存储的内容以及原因。从代码中
root=temp; //Root now points to temp
head->left=root;
head->lbit=1;
temp->left=head;// this line gives the segmentation fault
root未指向temp。temp(指针)已分配给root(指针)。
head的左指针是root,temp的左指针是head(这意味着root的左指针是head)
void索引(node*root)//树的索引遍历
{
如果(root==NULL)您询问给定的指针是否为NULL,然后尝试访问它?这有点像玩俄罗斯轮盘赌,只是不冒险,而是用子弹填满枪以确保自己被击中。这就是为什么我创建了变量temp(temp通过函数createnode(value))分配一块节点内存)。我检查我的根节点是否为空,如果为空,我会立即将其分配给临时。这意味着根指针现在指向有效的内存块。我正在尝试访问该内存块的“左”指针,并将其分配给新地址(“头”节点的地址)抱歉,错过了root=temp
部分。无论如何:您正在调用insert(root,data)
,但是insert
的第一个参数是
root=temp; //Root now points to temp
head->left=root;
head->lbit=1;
temp->left=head;// this line gives the segmentation fault
void inorder(node *root) // Inorder traversal of tree
{
if(root==NULL) <<<<<<
return;
inorder(root->left);
cout<<root->data<<"\t";
inorder(root->right);
}