2015-04-10 2 views
0

Это мой код здесь. Я хочу вставить элементы рекурсивно в двоичное дерево. Это не двоичное дерево поиска (левый ребенок не должен быть < родительский или правый ребенок не должен быть> родителем).C Программирование двоичного ввода дерева рекурсивно (не двоичное дерево поиска)

Это просто двоичное дерево, где для каждого узла может быть не более двух детей. Когда я выполняю обход, он просто печатает конечный узел бесконечно в бесконечном цикле (5-> 5-> 5 -> ....). Пожалуйста, помогите мне.

Я искал переполнение стека и ничего не основано на этом. Большинство из них - деревья двоичного поиска. Извините, если это плохой вопрос.

struct node { 
    int info; 
    struct node* left; 
    struct node* right; 
}*temp, *ptr, *prev; 

struct node *root, *start=NULL; 

void insert(struct node*); 
void inorder(struct node*); 

void insert(struct node* ptr) 
{ 
    int ch; 

    if(start==NULL) // if start is null, new node is made as start node. 
     start=ptr; 
    else 
    { 
     temp=(struct node*)malloc(sizeof(struct node)); //new node created 
     temp->left=NULL; 
     temp->right=NULL; 
     puts("Enter value"); 
     scanf("%d", &temp->info); 
     ptr=temp;  //ptr is set as new node 
    } 

    printf("Does %d have a left node? (1/0)\n", ptr->info); 
    scanf("%d", &ch); 
    if(ch==1) 
    { 
     prev=ptr; 
     if(ptr==start) 
      insert(start->left); //start->left will be the new 'ptr' in the next insertion scenario 
     else 
      insert(ptr->left); //same principle as above 
    } 

    printf("Does %d have a right node? (1/0)\n", ptr->info); 
    scanf("%d", &ch); 
    if(ch==1) 
    { 
     prev=ptr; 
     if(start==ptr) 
      insert(start->left); 
     else 
      insert(ptr->right); 
    } 

} 

void inorder(struct node* ptr) 
{ 
    while(ptr!=NULL) 
    { 
     inorder(ptr->left); 
     printf("%d -> ", ptr->info); 
     inorder(ptr->right); 
    } 
} 

void main(){ 
    int ch; 
    do{ 
     puts("1. Insert 2.Traverse 3.Exit"); 
     scanf("%d",&ch); 
     switch(ch){ 
      case 1: 
       puts("Enter root node"); 
       root=(struct node *)malloc(sizeof(struct node)); 
       root->left=NULL; 
       root->right=NULL; 
       scanf("%d", &root->info); 
       insert(root); 
       break; 
      case 2: 
       inorder(start); 
     } 
    }while(ch!=3); 
} 

Заранее спасибо, ребята.

+0

Ваша функция обхода выглядит нормально, но ваш код вставки повсюду. Я бы предложил две вещи: 1. остановитесь с глобалами. Это, как правило, плохая практика, особенно при работе с цепочками. 2. Используйте функцию (или функции) для управления деревом и добавления/вставки узлов. – Eregrith

+0

Если вы никогда раньше не использовали отладчик, это выглядит как отличная возможность учиться. См. Http://www.thegeekstuff.com/2010/03/debug-c-program-using-gdb/, если у вас есть gdb, доступный в вашей системе. – ericzundel

+0

@Eregrith Функция обхода не выглядит нормально - она ​​петляет навсегда, если 'ptr! = NULL'. – CiaPan

ответ

0

Попробуйте этот способ добавления узлов:

struct node *createTree() 
{ 
    struct node *node; 
    int resp; 

    node=malloc(sizeof(struct node)); //new node created 
    node->left=NULL; 
    node->right=NULL; 
    puts("Enter value"); 
    scanf("%d", &node->info); 

    printf("Does %d have a left node? (1/0)\n", node->info); 
    scanf("%d", &resp); 
    if(resp==1) 
     node->left = createTree(); 

    printf("Does %d have a right node? (1/0)\n", node->info); 
    scanf("%d", &resp); 
    if(resp==1) 
     node->right = createTree(); 

    return node; 
} 

затем в main() сделать:

root = createTree(); 

Примечание переменная resp имеет тип int при сканировании его с форматом "%d". Для типа char вы должны использовать формат "%c".

+0

Это также сработает. Спасибо :) +1. – akkhil

2

вашего обхода создать бесконечный цикл, вы должны изменить while к if

void inorder(struct node* ptr) 
{ 
    if (ptr != NULL) 
    { 
     inorder(ptr->left); 
     printf("%d -> ", ptr->info); 
     inorder(ptr->right); 
    } 
} 

в insert(struct node* ptr), когда вы делаете ptr=temp; это только меняющийся PTR внутри области видимости функции, так что на самом деле вы никогда не назначить левые и правые узлы для корень

+0

Спасибо за указание ошибки функции обхода. То же самое касается функции вставки, то, что вы сказали, имеет смысл. Что было бы подходящим решением? – akkhil

0

Я нашел решение для этого. Извините за то, что потратил ваше время. Проблема с моим кодом была:

1) В то время как вместо функции обхода 2) Во-вторых, когда я передаю аргумент ptr, он не знает, куда привязать этот ptr. Все, что я делал, это ptr = temp. Он должен ссылаться на предыдущий узел слева/справа, правильно?

@ Объяснение huxley по строкам функции было неправильным. Он должен указывать на один и тот же объект - поэтому мы используем указатели, верно? Однако, это позвонило мне в голову. Так вот решение ниже:

void insert(struct node* ptr, int side) 
{ 
    int ch; 

    if(start==NULL) // if start is null, new node is made as start node. 
     start=ptr; 
    else 
    { 
     temp=(struct node*)malloc(sizeof(struct node)); //new node created 
     temp->left=NULL; 
     temp->right=NULL; 
     puts("Enter value"); 
     scanf("%d", &temp->info); 
     ptr=temp; 
     if(side==1) 
      prev->left=ptr; 
     else 
      prev->right=ptr; 
    } 

    printf("Does %d have a left node? (1/0)\n", ptr->info); 
    scanf("%d", &ch); 
    if(ch==1) 
    { 
     prev=ptr; 
     insert(ptr->left, 1); 
    } 

    printf("Does %d have a right node? (1/0)\n", ptr->info); 
    scanf("%d", &ch); 
    if(ch==1) 
    { 
     prev=ptr; 
     insert(ptr->right, 2); 
    } 

} 

void inorder(struct node* ptr) 
{ 
    if(ptr!=NULL) 
    { 
     inorder(ptr->left); 
     printf("%d -> ", ptr->info); 
     inorder(ptr->right); 
    } 
} 

Я объяснил это detailedly, потому что это не правильный код вставки для бинарного дерева с помощью рекурсии. Я надеюсь, что все поймут.

Спасибо всем, кто помогал.

Приветствия, Akhil