Корневой узел дерева двоичного поиска остается НУЛЕВЫМ

#c #recursion #insert #binary-search-tree #function-definition

Вопрос:

по какой-то причине мой корневой узел постоянно остается пустым, и к нему ничего не добавляется. Я не уверен, почему, и мне было интересно, может ли кто-нибудь подсказать мне, что я делаю неправильно. Я пытаюсь прочитать файл и выполнить различные действия для каждого слова в зависимости от числа, которое я получаю. Если это 1, я пытаюсь вставить слово в двоичное дерево, если только оно не является дубликатом, и в этом случае я пытаюсь увеличить частоту на 1. Если это 2, я хочу иметь возможность распечатать глубину и количество раз, когда появляется слово. В конце концов, я хочу отобразить слова в зависимости от наиболее частых к наименее. Часть, на которой я застрял сейчас, заключается в том, что корневой узел всегда остается НУЛЕВЫМ, поэтому я не могу построить свое дерево, я также не знаю, в чем на самом деле проблема.

 #include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;string.hgt;  #define MAXSIZE 50  typedef struct node {  int depth;  int frequency;  struct node *left, *right;  char word[MAXSIZE]; } node;   node* insert(node* root, char newWord[MAXSIZE]) {  node *temp;  printf("insert Function is being calledn %sn", newWord);  if(root == NULL)  {  temp = (node*) malloc(sizeof(node));  temp-gt;frequency = 1;  temp-gt;depth = 1;  temp-gt;left = NULL;  temp-gt;right = NULL;  strcpy(temp-gt;word, newWord);  root = temp;  printf("You should only recieve this message once.n");  }  else if(strcmp(newWord, root-gt;word)lt;0)  {  printf("Word being added towards leftn");  insert(root-gt;left, newWord);  root-gt;depth  =1;  }  else if(strcmp(newWord, root-gt;word)gt;0)  {  insert(root-gt;left, newWord);  printf("Word being added towards rightn");  root-gt;depth  =1;  }  else if(strcmp(newWord, root-gt;word)==0)  {  printf("Word being duplicated");  root-gt;frequency  =1;  }  return(root); }  int inOrder(node* root) {  if(root != NULL)  {  inOrder(root-gt;left);  printf("BADAM %st", root-gt;word);  printf("%dn", root-gt;frequency);  inOrder(root-gt;right);  } }    void main() {  FILE *infile;  FILE *outfile;  char string[MAXSIZE];  int i, c, n, j, k;  node *root;  root = NULL;  infile = fopen("in.txt", "r");  fscanf(infile, "%dn", amp;n);  for(i=0;ilt;n;i  )  {  printf("%dn", i);  fscanf(infile, "%d %sn", amp;c, string);  printf("the action is %dn", c);  switch (c)  {  case 1:  printf("insert %sn", string);  insert(root, string);  break;  case 2:  printf("print frequency of %sn", string);  break;  default:  printf("error in inputn");  break;  inOrder(root);  }  } }  

Комментарии:

1. Ну, вы возвращаете новый корень, но никогда не используете возвращенное значение. Простое изменение локальной переменной с именем root ничего не сообщает вызывающему абоненту, потому что это локальная переменная.

Ответ №1:

Вам нужно назначить возвращенный указатель из функции insert корню указателя

 root = insert(root, string);  

и в рамках функции вам нужно написать

 root-gt;left = insert(root-gt;left, newWord);  

и вместо использования root-gt;слева в этом фрагменте кода

 else if(strcmp(newWord, root-gt;word)gt;0) {  insert(root-gt;left, newWord);  //...  

вам нужно использовать корневой указатель-gt;правый

 else if(strcmp(newWord, root-gt;word)gt;0) {  root-gt;right = insert(root-gt;right, newWord);  //...