我试图实现一个二叉树并在 pre-order 中遍历它,但它仅在显示函数中显示 0,并且创建函数正在运行
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
#include
//diclaration
struct node* create();
struct node
{
int data;
struct node *left,*right;
};
struct node *root,*newnode;
void preorder(struct node*root);
**创建函数正在运行**
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);
}
/*
输出
你想创建(0)还是显示(1)一棵树 0
输入值或 -1 表示没有节点 12
输入12的左边child
输入值或 -1 表示没有节点 13
输入13的左边child
输入值或 -1 无节点 -1
输入13的右边child
输入值或 -1 无节点 -1
输入12的右边child
输入值或 -1 表示没有节点 15
输入15的左边child
输入值或 -1 无节点 -1
输入15的右边child
输入值或 -1 无节点 -1
你想继续吗(1/0)1
您想创建(0) 还是显示(1) 一棵树 1
预购为 0
你想继续吗 (1/0)
*/
在create
中,您将新分配的节点分配给newnode
,这是一个全局变量。这意味着在函数的每个实例中,它都写入同一个变量,覆盖那里的任何内容。
因为这样的问题,应该避免使用全局变量。 newnode
应声明为 create
的局部变量,root
应在 main
函数中声明。
此外,如果您为特定节点输入 -1,则会发生内存泄漏。要解决此问题,请将读取值后分配新节点的代码移动到 else
部分。
问题不在于显示函数认为您犯了一个小错误,有些人可能会说这不是错误,只是因为编译器接受了它并做了它应该做的事情。您犯的小错误是检查指针。当您检查指针的值时,最好使用关键字 NULL,而不是 0! root==NULL 或 root!=NULL.
现在介绍您的创建函数。
全局 newNode 与递归结合时将无法正常工作!!!
由于创建,你的树的结构被弄乱了,这就是显示不工作的原因!!!
#include
//diclaration
struct node* create();
struct node
{
int data;
struct node *left,*right;
};
struct node *root,*newnode;
void preorder(struct node*root);
**创建函数正在运行**
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);
}
/* 输出 你想创建(0)还是显示(1)一棵树 0
输入值或 -1 表示没有节点 12
输入12的左边child 输入值或 -1 表示没有节点 13
输入13的左边child 输入值或 -1 无节点 -1
输入13的右边child 输入值或 -1 无节点 -1
输入12的右边child 输入值或 -1 表示没有节点 15
输入15的左边child 输入值或 -1 无节点 -1
输入15的右边child 输入值或 -1 无节点 -1
你想继续吗(1/0)1
您想创建(0) 还是显示(1) 一棵树 1
预购为 0 你想继续吗 (1/0) */
在create
中,您将新分配的节点分配给newnode
,这是一个全局变量。这意味着在函数的每个实例中,它都写入同一个变量,覆盖那里的任何内容。
因为这样的问题,应该避免使用全局变量。 newnode
应声明为 create
的局部变量,root
应在 main
函数中声明。
此外,如果您为特定节点输入 -1,则会发生内存泄漏。要解决此问题,请将读取值后分配新节点的代码移动到 else
部分。
问题不在于显示函数认为您犯了一个小错误,有些人可能会说这不是错误,只是因为编译器接受了它并做了它应该做的事情。您犯的小错误是检查指针。当您检查指针的值时,最好使用关键字 NULL,而不是 0! root==NULL 或 root!=NULL.
现在介绍您的创建函数。 全局 newNode 与递归结合时将无法正常工作!!! 由于创建,你的树的结构被弄乱了,这就是显示不工作的原因!!!