当前位置: 首页 > 知识库问答 >
问题:

二叉搜索树疯狂

阎弘
2023-03-14

我必须编写一个二进制搜索树的实现,它可以处理库的库存。它读取一个包含所有书籍的文本文件,并将这些书籍按字母顺序添加到树中。我已经与Insertar()函数代码斗争了几天,但我无法使它正常工作,它基本上接收到一个指针,指向与书相关的所有数据的树根。如果根为NULL,则它将函数中输入的所有值初始化一个节点,并将内存方向指定为NULL节点。问题是,它在本地做,最终它没有分配它。谁能帮我纠正那个具体的功能吗?

功能和结构:

nodoarbol:节点
arbolbin:Binary Tree,它有一个指向根节点的指针和一个包含元素数的int
initnodo:Inits节点,返回指向节点的指针
raiz:返回指向二叉树根的指针
Clear,clear_aux:Clears树
ingresar:Insert()函数和问题的来源
imprimir:rints节点的元素。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct nodoArbol {
    char nombre[51],autor[51];
    int valor,stock,anno;
    struct nodoArbol *der;
    struct nodoArbol *izq;
} tNodoArbol;

typedef struct {
    tNodoArbol *root;
    int n;
} ArbolBin;

tNodoArbol* InitNodo(char *nombre,char *autor, int stock, int valor, int anno){
    tNodoArbol *p;
    p= (tNodoArbol*)malloc(sizeof(tNodoArbol));
    strcpy(p->nombre, nombre);
    strcpy(p->autor, autor);
    p->stock = stock;
    p->anno = anno;
    p->valor = valor;
    p->izq = NULL;
    p->der = NULL;
    return p;
}

tNodoArbol* Raiz(ArbolBin p){
    return (&p)-> root;
}

void Init(ArbolBin *p){
    p->root = NULL;
    p->n = 0;
}

void clear_aux(tNodoArbol *nodo){
    if (nodo == NULL){
        return;
    }
    clear_aux(nodo->izq);
    clear_aux(nodo->der);
    free((void *) nodo);
}

void Clear(ArbolBin *p){
    clear_aux(p->root);
    p->root = NULL;
    p->n = 0;
}

void Insertar (tNodoArbol *nodo, char *nombre,char *autor, int stock, int valor, int anno){

    if (nodo == NULL){
        nodo = (InitNodo(nombre,autor,stock,valor,anno));
    }
    else{
        int result;
        result = strcmp(nodo->nombre,nombre);
        if (result>0){
            Insertar (nodo->der, nombre,autor,stock,valor,anno);
        }
        else if (result<0){
            Insertar (nodo->izq, nombre,autor,stock,valor,anno);
        }
    }
}

void Imprimir(tNodoArbol *nodo){
    printf("Nombre:%s \n",nodo->nombre);
    printf("Autor:%s \n",nodo->autor);
    printf("Stock:%d \n",nodo->stock);
    printf("Valor:%d \n",nodo->valor);
    printf("anno:%d \n",nodo->anno);
}

int main(){

char a[50]= "holi",b[50] ="asdasdasd";
ArbolBin Tree;
tNodoArbol *Root;

Init(&Tree);
Root = Raiz(Tree);
Insertar(Root,a,b,2,1000,2014);
Imprimir(Root);
return 0;
}

共有1个答案

斜向文
2023-03-14
tNodoArbol *Root;

Insertar(Root,a,b,2,1000,2014);

void Insertar (tNodoArbol *nodo, char *nombre,char *autor, int stock, int valor, int anno){

    if (nodo == NULL){
        nodo = (InitNodo(nombre,autor,stock,valor,anno));
    }
    else{
        int result;
        result = strcmp(nodo->nombre,nombre);
        if (result>0){
            Insertar (nodo->der, nombre,autor,stock,valor,anno);/*nodo just a pointer,node->der  is illeagl*/
        }
        else if (result<0){
            Insertar (nodo->izq, nombre,autor,stock,valor,anno);/*the same error */
        }
    }
}
-----------------------------------------------------------------------------------------
your declaration a pointer, you want through the Insertar()  change the Root, you need use 
Insertar(&Root,a,b,2,1000,2014), because the Root in the Insertar() is not the Root in the main() ,they just have the same value,we just copy the value of Root(main)  to Root(Insertar).
---------------------------------------------------------------------------------------
void Insertar (tNodoArbol **nodo, char *nombre,char *autor, int stock, int valor, int anno){

    if (*nodo == NULL){
        *nodo = (InitNodo(nombre,autor,stock,valor,anno));
    }
    else{
        int result;
        result = strcmp((*nodo)->nombre,nombre);
        if (result>0){
            Insertar ((*nodo)->der, nombre,autor,stock,valor,anno);
        }
        else if (result<0){
            Insertar ((*nodo)->izq, nombre,autor,stock,valor,anno);
        }
    }
}
 类似资料:
  • 我很难按我教授想要的格式打印出一个二叉搜索树。 他的格式是这样的: 我的代码:

  • 树的特征和定义 树(Tree)是元素的集合。我们先以比较直观的方式介绍树。下面的数据结构是一个树: 树有多个节点(node),用以储存元素。某些节点之间存在一定的关系,用连线表示,连线称为边(edge)。边的上端节点称为父节点,下端称为子节点。树像是一个不断分叉的树根。 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent)。比如说,3,5是6的子节点,6是3,

  • 编写一个函数,如果给定的二叉搜索树包含给定的值,则返回1,否则返回0。 例如,对于以下树: N1(值:1,左:null,右:null) n2(值:2,左:n1,右:n3) N3(值:3,左:null,右:null) 对contains(&n2,3)的调用应返回1,因为根位于n2的树包含编号3。 函数应该返回1,然而,它返回0或者根本不返回。

  • 在二元搜索树的情况下,为什么我们不能简单地在一个节点有两个子节点的情况下,将一个节点的前一个节点替换为后一个节点?

  • 上面的代码对所有测试用例都能很好地工作。但是,下面的代码不是。 额外的IF条件有什么需要?即使没有它们,函数也应该从下面的if条件返回false?我错过了什么?

  • 好的,所以我目前正在尝试创建一个二叉搜索树,每个节点都包含对某个对象的引用,以及对其左侧子项的引用和对右子项的引用(总共3个变量)。左子项必须始终小于其父项,而右子项必须始终大于其父项。我必须创建两个方法:1种方法( contains()) 来检查元素是否在树中,以及一个add()方法将元素添加到树中的适当位置。 以下是BinarySearchTree类: 下面是TreeNode类(包含在Bina