我试图实现一个二叉树并在 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 与递归结合时将无法正常工作!!! 由于创建,你的树的结构被弄乱了,这就是显示不工作的原因!!!