是否有必要在读取二进制搜索树中的第一个值时重新分配“root”节点?

时间:2018-05-22 09:36:25

标签: c binary-search-tree

我正在努力尝试在C中实现二进制搜索树,并遇到过这个问题。我已经使我的插入函数为void类型,因此我没有一个变量来指定此回调的值。当我运行程序时,我没有看到任何输出。这是否与我有关,一旦它从NULL更改为指向值,就不会分配我的根节点指针?

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

typedef struct node
{
   int data;
   struct node *left, *right;
}Node;

void addToNode(Node *A, int value)
{
   A->data=value;
   A->left=NULL;
   A->right=NULL;
}

void insert(Node *A, int value)
{
   if(A==NULL)
   {
      A = (Node*)malloc(sizeof(Node));
      addToNode(A, value);
      // printf("Hello\n");
      return;
   }
   else
   {
      if(value>A->data)
      {
         insert(A->right, value);
         // printf("Hello\n");
         return;
      }
      else if(value<A->data)
      {
         insert(A->right, value);
         // printf("Hello\n");
         return;
      }
  }
}

void inorder(Node *root)
{
   if (root != NULL)
   {
      // printf("Hello\n");
      inorder(root->left);
      printf("%d \n", root->data);
      inorder(root->right);
   }
}

int main()
{
    Node *root = NULL;
    int A[]={45,32,56,23,11,89};
    for(int i=0; i<6; i++) insert(root,A[i]);
    inorder(root);
}

2 个答案:

答案 0 :(得分:0)

问题不在于你的函数是void,而是它取值根指针而不是指针。这就是为什么这个任务

A = (Node*)malloc(sizeof(Node));

仍然是insert功能的本地地址; <{1}}的变量root仍然未分配。

修改函数以通过指针获取节点:

main

现在,void insert(Node **A, int value) { if(*A == NULL) { *A = malloc(sizeof(Node)); addToNode(*A, value); return; } Node *root = *A; if (value > root->data) { insert(&root->right, value); } else if (value < root->data) { insert(&root->left, value); } } 中的来电看起来像main,因此作业insert(&root, A[i]);会根据需要修改*A = malloc(sizeof(Node))

答案 1 :(得分:0)

您应该将Node作为指针传递给指针。因为你想对指针本身进行更改。

void insert(Node **A, int value)
{
    if(*A==NULL)
    {
        *A = (Node*)malloc(sizeof(Node));
        addToNode(*A, value);
        // printf("Hello\n");
        return;
    }
    else
    {
        if(value>(*A)->data)
        {
            insert(&(*A)->right, value);
            // printf("Hello\n");
            return;
        }
        else if(value<(*A)->data)
        {
            insert(&(*A)->left, value);
            // printf("Hello\n");
            return;
        }
    }
}