Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分段故障(核心转储)-线程二叉搜索树_C++_Binary Tree_Binary Search Tree - Fatal编程技术网

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);
    }