[英]I tried to implement a binary tree and traverse it in pre-order but it is showing 0 only in display function, and the create function is working
#include<stdio.h> #include<stdlib.h>
//diclaration
struct node* create();
struct node
{
int data;
struct node *left,*right;
};
struct node *root,*newnode;
void preorder(struct node*root);
**创建 function 正在工作**
struct node* create()
{
int x;
//newnode=(struct node*)malloc(sizeof(struct node));
newnode=(struct node*)malloc(sizeof(struct node));
printf("\t\nenter the value or -1 for no node ");
scanf("%d",&x);
if(x==-1)
{return 0;}
else
{
newnode->data=x;
printf("\t\nenter the left child of %d ",x);
newnode->left=create();
printf("\t\nenter the right child of %d ",x);
newnode->right=create();
return newnode;
}
}
**但显示无法正常工作**
void preorder(struct node*root)
{
if(root==0)
{ return;}
else
{
printf("%d ",root->data);
preorder(root->left);
preorder(root->right);
}
}
void main()
{
//root=0;
//root=create();
int f;
do{
int c;
printf("\t\ndo you want to create(0) or display(1) a tree ");
scanf("%d",&c);
switch(c)
{
case 0:
root=0;
root=create();
break;
case 1: printf("\t\npre order is ");
preorder(root);
break;
default:printf("\t\nenter a valid number");
break;
}
printf("\t\ndo you want to proceed (1/0)");
scanf("%d",&f);
}while(f==1);
}
/* OUTPUT 你想创建(0)还是显示(1)一棵树 0
输入值或 -1 表示没有节点 12
输入 12 的左子节点 输入值或 -1 表示没有节点 13
输入 13 的左子节点 输入值或 -1 表示没有节点 -1
输入 13 的右子节点 输入值或 -1 表示没有节点 -1
输入 12 的右子节点 输入值或 -1 表示没有节点 15
输入 15 的左子节点 输入值或 -1 表示没有节点 -1
输入 15 的右子节点 输入值或 -1 表示没有节点 -1
你想继续吗 (1/0)1
你想创建(0)还是显示(1)一棵树 1
预购是 0 你想继续吗 (1/0) */
在create
中,您将新分配的节点分配给newnode
,它是一个全局变量。 这意味着在 function 的每个实例中,它写入同一个变量,覆盖那里的所有内容。
由于此类问题,应避免使用全局变量。 newnode
应该声明为 local 以create
,并且root
应该声明在main
function 中。
此外,如果您为特定节点输入 -1,则会出现 memory 泄漏。 要解决此问题,请将读取值后分配新节点的代码移至else
部分。
问题不在于显示 function 认为你犯了一个小错误,有些人可能会说这不是一个错误,因为编译器接受它并做了它应该做的事情。 你犯的小错误是指针的检查。 当您检查指针的值时,最好使用关键字 NULL,而不是 0。!! root==NULL 或 root!=NULL。
现在关于您创建 function。 与递归结合使用的全局 newNode 将无法正常工作!!! 由于创建,您的树的结构搞砸了,这就是显示不起作用的原因!!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.