【发布时间】:2015-06-16 04:26:12
【问题描述】:
这是我的代码。我想将项目递归地插入二叉树。它不是二叉搜索树(左孩子不必是父母)。
它只是一个二叉树,每个节点最多可以有两个孩子。当我执行遍历时,它只是在无限循环中无休止地打印出起始节点(5-> 5-> 5->....)。请帮帮我。
我已经通过 Stack Overflow 进行了搜索,但没有任何内容基于此。大多数是二叉搜索树。如果这是一个不好的问题,我很抱歉。
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. 使用一个(或多个)函数来操作您的树并添加/插入节点。
-
如果您以前从未使用过调试器,这看起来是一个很好的学习机会。如果您的系统上有可用的 gdb,请参阅 thegeekstuff.com/2010/03/debug-c-program-using-gdb。
-
@Eregrith 遍历函数看起来不太好——如果
ptr != NULL,它将永远循环。 -
@CiaPan 真的很抱歉,我想我需要多睡点>_while
标签: c binary-tree insertion