首页 > 解决方案 > (二叉树)代码不起作用但编译时不返回错误

问题描述

编译此代码时,编译器不会返回任何警告或错误,但代码根本不起作用。

函数inserirDado应该递归地创建节点并将值存储在 node.valor 中,应用我之前设置的条件。

void inserirDado(struct node **no, int numero)
{
     if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.

          * no = (struct node *) malloc(sizeof(struct node));
          (*no)->direita = NULL;
          (*no)->esquerda = NULL;
          (*no)->valor = numero;

     }else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
          if (numero < (*no)->valor) {
               inserirDado(&(*no)->esquerda, numero);
          }
          else
          {
               inserirDado(&(*no)->direita, numero);
          }
          
     }
}

emOrdem,函数调用自身直到它到达叶子,然后它应该打印存储在 node.valor 的值:

void emOrdem(struct node *no)
    {
         if(no != NULL)
         {
              emOrdem(no->esquerda);
              printf("%i", no->valor);
              emOrdem(no->direita);
    
         }
    }

完整的代码是:

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

struct node
{
     int valor;
     struct node *esquerda;
     struct node *direita;
};

void inserirDado(struct node **no, int numero);

void emOrdem(struct node *no);

int main(void) {

    struct node **arvore1;
    inserirDado(arvore1, 4);
    inserirDado(arvore1, 2);
    inserirDado(arvore1, 3);
    inserirDado(arvore1, 10);
    emOrdem(*arvore1);

}

//Funcao de colocar um numero aleatoria dentro de um Node.
//Ao fazer isso com varios numeros, serao criados nodos com descendentes.

void inserirDado(struct node **no, int numero)
{
     if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.

          * no = (struct node *) malloc(sizeof(struct node));
          (*no)->direita = NULL;
          (*no)->esquerda = NULL;
          (*no)->valor = numero;

     }else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
          if (numero < (*no)->valor) {
               inserirDado(&(*no)->esquerda, numero);
          }
          else
          {
               inserirDado(&(*no)->direita, numero);
          }
          
     }
}

void emOrdem(struct node *no)
{
     if(no != NULL)
     {
          emOrdem(no->esquerda);
          printf("%i", no->valor);
          emOrdem(no->direita);

     }
}

标签: cpointersbinary-tree

解决方案


(1) 实际上,您应该收到 SEG Fault,因为您尚未将 arovore1 初始化为 NULL。

(2) 这里要提到的重要一点是,我们使用双指针来摆脱返回值。你在这里所做的有点矛盾。

--> 基本上我们将创建一个节点 (arvore1),然后将节点 (&arvore1) 的地址发送到 insertNode (inserirDado) 函数,在其中,我们将该地址中的相应节点更新为新创建的节点 (temp) . 我在这里附上了工作代码。请参考此内容,如有任何疑问,您可以将其评论下来。

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

struct node
{
     int valor;
     struct node *esquerda;
     struct node *direita;
};

void inserirDado(struct node **no, int numero);

void emOrdem(struct node *no);

int main(void) {

    struct node *arvore1 = NULL;
    inserirDado(&arvore1, 4);
    emOrdem(arvore1);

}

//Funcao de colocar um numero aleatoria dentro de um Node.
//Ao fazer isso com varios numeros, serao criados nodos com descendentes.

void inserirDado(struct node **no, int numero)
{
     if(*no == NULL) { //Se nao houver um nodo anterior, o primeiro numero se torna RAIZ.

          struct node *temp = (struct node *) malloc(sizeof(struct node));
          (temp)->direita = NULL;
          (temp)->esquerda = NULL;
          (temp)->valor = numero;
          *no = temp;

     }else{ //Caso contrario, a definicao do numero, se entrara no nodo esquerdo ou direito.
          if (numero < (*no)->valor) {
               inserirDado(&(*no)->esquerda, numero);
          }
          else
          {
               inserirDado(&(*no)->direita, numero);
          }
          
     }
}

void emOrdem(struct node *no)
{
     if(no != NULL)
     {
          emOrdem(no->esquerda);
          printf("%d", no->valor);
          emOrdem(no->direita);

     }
}

推荐阅读