C 递归编程二叉树插入(不是二叉搜索树)
C Programming Binary Tree Insertion Recursively (Not Binary Search Tree)
这是我的代码。我想递归地将项目插入到二叉树中。它不是二叉搜索树(左 child 不必 < parent 或右 child 不必 > parent)。
它只是一棵二叉树,每个节点最多可以有两个 children。当我执行遍历时,它只是在无限循环中无休止地打印出起始节点(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);
}
提前致谢各位。
您的遍历创建无限循环,您应该将 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,所以实际上你永远不会为根
分配左右节点
试试这种添加节点的方式:
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();
请注意,如果您使用 "%d"
格式扫描 resp
变量,则其类型为 int
。对于类型 char
你应该使用格式 "%c"
.
我已经找到解决办法了。抱歉浪费您的时间。我的代码的问题是:
1)遍历函数中while代替if
2) 其次,当我传递参数 ptr 时,它不知道 link 那个 ptr 到哪里。我一直在做的就是 ptr=temp。一定是link到前一个节点的left/right吧?
@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);
}
}
我解释得很详细,因为使用递归的二叉树没有合适的插入代码。希望大家理解。
感谢所有帮助过的人。
干杯,
阿基尔
这是我的代码。我想递归地将项目插入到二叉树中。它不是二叉搜索树(左 child 不必 < parent 或右 child 不必 > parent)。
它只是一棵二叉树,每个节点最多可以有两个 children。当我执行遍历时,它只是在无限循环中无休止地打印出起始节点(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);
}
提前致谢各位。
您的遍历创建无限循环,您应该将 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,所以实际上你永远不会为根
试试这种添加节点的方式:
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();
请注意,如果您使用 "%d"
格式扫描 resp
变量,则其类型为 int
。对于类型 char
你应该使用格式 "%c"
.
我已经找到解决办法了。抱歉浪费您的时间。我的代码的问题是:
1)遍历函数中while代替if 2) 其次,当我传递参数 ptr 时,它不知道 link 那个 ptr 到哪里。我一直在做的就是 ptr=temp。一定是link到前一个节点的left/right吧?
@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);
}
}
我解释得很详细,因为使用递归的二叉树没有合适的插入代码。希望大家理解。
感谢所有帮助过的人。
干杯, 阿基尔