在二进制树中插入数据时出错

Error inserting data in binary tree

本文关键字:数据 出错 插入 二进制      更新时间:2023-10-16

我复制了这段代码(西班牙语)http://www.elrincondelc.com/nuevorincon/index.php?pag=codigos&id=4,并写了一个新的。

这是我的代码:

#include <cstdlib>
#include <conio.h>
#include <iostream>
using namespace std;
struct nodoarbol {
    int dato;
    struct nodoarbol *izq;
    struct nodoarbol *der;
};
typedef nodoarbol Nodo;
typedef Nodo *Arbol;
void insertar(Arbol *, int);
void inorden(Arbol);
void postorden(Arbol);
void preorden(Arbol);
void insertar(Arbol *raiz, int nuevo){
    if (*raiz==NULL){
        *raiz = (Nodo *)malloc(sizeof(Nodo));
        if (*raiz != NULL){
            (*raiz)->dato=nuevo;
            (*raiz)->der=NULL;
            (*raiz)->izq=NULL;
        }
        else{
            cout<<"No hay memoria suficiente u ocurrio un error";
        }
    }
    else{
        if (nuevo < (*raiz)->dato)
            insertar( &((*raiz)->izq), nuevo  );
        else if (nuevo > (*raiz)->dato)
            insertar(&((*raiz)->der), nuevo);
    }
}//inseertar
void inorden(Arbol raiz){
    if (raiz != NULL){
        inorden(raiz->izq);
        cout << raiz->dato << " ";
        inorden(raiz->der);
    }
}
void preorden(Arbol raiz){
    if (raiz != NULL){
        cout<< raiz->dato << " ";
        preorden(raiz->izq);
        preorden(raiz->der);
    }
}
void postorden(Arbol raiz){
    if (raiz!=NULL){
        postorden(raiz->izq);
        postorden(raiz->der);
        cout<<raiz->dato<<" ";
    }
}
int main() {
    int i;
    i=0;
    int val;
    Arbol raiz = NULL;
    for (i=0; i<10; i++){
        cout<<"Inserte un numero";
        cin>>val;
        insertar( (raiz), val);
    }
    cout<<"nPreordenn";
    preorden(raiz);
    cout<<"nIneordenn";
    inorden(raiz);
    cout<<"nPostordenn";
    postorden(raiz);
    return 0;
}

我使用的是netbeans 7.1.1,mingw32编译器

这是输出:

make[2]: Leaving directory `/q/netbeans c++/NetBeansProjects/treek'
make[1]: Leaving directory `/q/netbeans c++/NetBeansProjects/treek'
main.cpp: In function 'int main()':
main.cpp:110:30: error: cannot convert 'Arbol {aka nodoarbol*}' to 'Nodo** {aka nodoarbol**}' for argument '1' to 'void insertar(Nodo**, int)'
make[2]: *** [build/Release/MinGW-Windows/main.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 11s)

我不明白哪里出了问题,因为我只是复制了代码(并将其重写为我自己的代码)。我真的很擅长php、asp.net(vb)和其他语言,但c对我来说是个难题

我已经和这个问题斗争了大约一个小时。有人能告诉我可能是什么吗?

for (i=0; i<10; i++){
        cout<<"Inserte un numero";
        cin>>val;
        insertar( (raiz), val);
    }

应该(至少)是:

for (i=0; i<10; i++){
            cout<<"Inserte un numero";
            cin>>val;
            insertar( &raiz, val);
        }

此外,您的插入功能会用覆盖现有节点

if (*raiz != NULL){
(*raiz)->dato=nuevo;
(*raiz)->der=NULL;
(*raiz)->izq=NULL;
}

更新:上述说法不正确。if (*raiz != NULL){}处于以(*raiz ==NULL)为条件的子块中。

尝试(未经测试!)删除递归。

void insertar(Arbol *raiz, int nuevo){
    while (*raiz) {
       if (nuevo == (*raiz)->dato) return;
       raiz =  (nuevo < (*raiz)->dato) 
               ? &(*raiz)->izq
               : &(*raiz)->der
               ;
        }
   *raiz = (Nodo *)malloc(sizeof(Nodo));
    if (*raiz != NULL){
        (*raiz)->dato=nuevo;
        (*raiz)->der=NULL;
        (*raiz)->izq=NULL;
        }
    else{
        cout<<"No hay memoria suficiente u ocurrio un error";
        }
    }
}//inseertar

额外注释:原始代码看起来更像C而不是C++。(我不做C++)在C中,可以而不是强制转换malloc的返回,最好不要将指针隐藏在typedef后面。在C++中(有人告诉我)不应该使用malloc()。

main.cpp:10:30:错误:无法将参数"1"的"Arbol{aka nodoarbol*}"转换为"Nodo**{aka-nodoarbol*}",转换为"void insertar(Nodo*,int)"

void insertar(Arbol *raiz, int nuevo) { ... }
Arbol raiz = NULL;

替换:

- insertar( (raiz), val);

带有:

+ insertar( &raiz, val);