Это мой код здесь. Я хочу вставить элементы рекурсивно в двоичное дерево. Это не двоичное дерево поиска (левый ребенок не должен быть < родительский или правый ребенок не должен быть> родителем).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);
}
Заранее спасибо, ребята.
Ваша функция обхода выглядит нормально, но ваш код вставки повсюду. Я бы предложил две вещи: 1. остановитесь с глобалами. Это, как правило, плохая практика, особенно при работе с цепочками. 2. Используйте функцию (или функции) для управления деревом и добавления/вставки узлов. – Eregrith
Если вы никогда раньше не использовали отладчик, это выглядит как отличная возможность учиться. См. Http://www.thegeekstuff.com/2010/03/debug-c-program-using-gdb/, если у вас есть gdb, доступный в вашей системе. – ericzundel
@Eregrith Функция обхода не выглядит нормально - она петляет навсегда, если 'ptr! = NULL'. – CiaPan