2015-01-20 3 views
0

Когда я выполняю свой код, я получаю неверный результат для предварительного обхода моего двоичного дерева. Я ожидаю, что моя программа напечатает этот предварительный заказ 5 -> 4 -> 3 -> 2-> 6 -> 7 -> 8. Я не могу указать свою ошибку в коде. Скажите, пожалуйста, где я ошибся.Неожиданный обход предварительного дерева дерева

Это мой вход и выход (пример запуск):

ENTER THE NODE DATA 
5 
ENTER YOUR CHOICE 
ENTER THE NODE DATA 
4 
ENTER YOUR CHOICE 
ENTER THE NODE DATA 
6 
ENTER YOUR CHOICE 
ENTER THE NODE DATA 
3 
ENTER YOUR CHOICE 
ENTER THE NODE DATA 
7 
ENTER YOUR CHOICE 
ENTER THE NODE DATA 
2 
ENTER YOUR CHOICE 
ENTER THE NODE DATA 
8 
ENTER YOUR CHOICE 
5 -> 4 -> 3 -> 2 -> 8 -> 7 -> 6 -> 

Это код для создания бинарного дерева и печати предзаказа обхода дерева.

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

struct node { 
       int data; 
       struct node *right; 
       struct node *left; 
      } *tmp = NULL; 

typedef struct node NODE; 

    NODE *root = NULL; 
    NODE *child, *new_node; 

void preorder(NODE *t) 
{ 
    if(t != NULL) 
    { 
      printf("%d -> ",t->data); 
      preorder(t->left); 
      preorder(t->right); 
    }//IF 
} 
    int main() 
    { 
     char choice; 
     do{ 
      new_node = (NODE *)malloc(sizeof(NODE)); 
      printf("ENTER THE NODE DATA \n"); 
      scanf("%d",&new_node -> data); 

      new_node -> right = NULL; 
      new_node -> left = NULL; 

      if(root == NULL) 
      { 
        root = new_node; 
        tmp = new_node; 
      }//IF 

      else 
      { 
       child = new_node; 

       while(1) 
       { 
         if(child -> data < tmp -> data) 
         { 
          if(tmp -> left == NULL) 
           { 
            tmp -> left = new_node; 
            break; 
           }//if2 
           tmp = tmp -> left; 
         }//if1 

         if(child -> data > tmp -> data) 
         { 
          if(tmp -> right == NULL) 
          { 
           tmp -> right = new_node; 
           break; 
          }//if4 
          tmp = tmp -> right; 
         }//if3 
       }//while 
      }//else 
      printf("\n ENTER YOUR CHOICE \n"); 
      choice = getch(); 
     }//do 
     while(choice != 'n'); 
     preorder(root); 
     getch(); 
     return 0; 
    }//main 
+0

Обратите внимание, что операторы '.' и' -> '(точка и стрелка) связывают очень плотно и не должны иметь пространств вокруг них. –

+0

Несогласованный отступ делает этот код довольно трудным для подражания. – dfeuer

+0

Вы должны избегать глобальных переменных, когда это возможно. Ни одна из четырех переменных не должна быть глобальной. –

ответ

1

В это время добавьте следующее заявление.

else { 
child=new_node; 
tmp=root; 
... 
... 
} 

После каждого цикла значение tmp будет изменено. Мы должны проверить новое значение с самим корнем.

+0

Все еще я получаю такой же выход. Что делать –

+0

@ user2671906 Где вы разместили это условие? –

+0

if (root == NULL) { root = new_node; tmp = корень; } –

1

Вы не сбросить tmp быть корнем в каждой итерации.

Обратите внимание, что нет необходимости в переменной child, так как ее значение полностью совпадает с его значением new_node.

+0

Где я должен установить tmp как root на каждой итерации. –

Смежные вопросы