二进制搜索树未构建,导致分段错误

时间:2019-06-21 11:57:37

标签: c++ algorithm data-structures binary-search-tree

我正在构建二进制搜索树;但该功能给细分错误。我不知道问题出在哪里。

insertintree中树无法建立零件无法正常工作,我已经尝试了方法,但无法正常工作

#include<bits/stdc++.h>
using namespace std;
struct node // structure of node
{
    int k;
    node* left = NULL;
    node* right = NULL;
};

void insertintree(node* root, int key)
{
    if (root == NULL)//root addition
    {
        node* root = new node;
        root->k = key;
    }
    else 
    {
        if (root->k < key)  insertintree(root->right, key);
        else insertintree(root->left, key);
    }
}

void inorder(node* root) 
{
    if (root != NULL) {
        inorder(root->left);
        cout << root->k;
        inorder(root->right);
    }
}

int main() 
{
    node* root = NULL;
    insertintree(root, 1);
    cout << root->k;
}

2 个答案:

答案 0 :(得分:3)

主要有两个问题:

  1. 您需要通过引用传递root,否则,insertintree 将与您传递的root的副本一起使用。

    void insertintree(node* &root, int key)
    //                     ^^^
    {
    
    }
    
  2. 其次,在第一个if的正文中,您重新声明了一个新的root Node,这将遮盖传递的阴影。更改为

    if (root == NULL)//root addition    
    {
         root = new node;
         root->k = key;
    }
    

还要避免与#include<bits/stdc++.h>using namespace std;一起练习:为什么?请参阅以下讨论:

答案 1 :(得分:2)

您的代码存在多个问题。首先是您重新声明migrate

root

这是两个不同的变量(即使它们具有相同的名称)。你应该写这个

void insertintree(node* root,int key) // root declared here
{
    if(root==NULL)
    {
        node* root = new node; // root redeclared here

第二个问题是您期望void insertintree(node* root, int key) // root declared once { if(root==NULL) { root = new node; // now this is the root declared above 函数更改intsertintree中声明的根,但不会。同样,仅仅因为两个变量具有相同的名称并不意味着它们是相同的变量。

main

更改void insertintree(node* root,int key) // a variable called root { ... } int main() { node* root = NULL; // another variable called root ... } 中的root变量对insertintree中名为root的变量完全没有影响,它们是不同的变量。

要进行此项工作,您必须通过引用。当变量是引用时,对其进行更改会更改要引用的变量。像这样更改您的main函数

insertintree

现在void insertintree(node*& root,int key) // ^ this makes root a reference { 是对root中变量的引用,对其进行更改也会改变main中的变量。

以同样的方式,当您像这样递归调用main

insertintree

insertintree(root->right,key); 函数将能够更改insertintree,因为它需要对root->right引用