这是 inserting/creating 二叉树的代码?但是 display() 函数没有显示任何内容?我错过了什么?

This is the code for inserting/creating a binary tree? but the display() function is not displaying anything? what am I missing?

有一个递归插入树的插入函数和显示输出的显示函数。 display() 函数没有显示任何内容?有什么我遗漏的错误吗? 请帮忙

#include <stdio.h>
#include<stdlib.h>

typedef struct node
{   int val;
    struct node *left;
    struct node *right;
} node;

node *root=NULL;

void insert(node *root1,int value)
{
    if(root==NULL)
    {
        node *temp=(node*)malloc(sizeof(node));
        temp->val=value;
        temp->left=NULL;
        temp->right=NULL;
        root=temp;
        root1=root;
        return;
    }


    if(root1==NULL && root!=NULL)
    {
        node *temp=(node*)malloc(sizeof(node));
        temp->val=value;
        temp->left=NULL;
        temp->right=NULL;
        root1=temp;
        return;
    }


    if(root1->val >value)
    {
        insert(root1->left, value);
    }
    else
    {
        insert(root1->right, value);
    }

    return;
}


void display(node *root1)
{
    if(root1==NULL)
    {
        return;
    }
    while(root1 !=NULL)
    {
        printf("%d\n", root1->val);
        display(root1->left);
        display(root1->right);
        return;
    }
}


int main()
{
    insert(root,4);
    insert(root,12);
    insert(root,2);
    insert(root,55);
    display(root);
    return 0;
}

实际上,我是编程新手并尝试实现树。也欢迎新的建议!谢谢

//编辑

void sayHi(int* nums){
    printf("hello");
    printf("my address is %d \n",nums);
    printf("val of nums[2] is%d\n", nums[2]);
    nums[2]=30;   
}



void someFunct(int* nums, int numsSize){
    nums[2]=50;
    sayHi(nums);
    printf("address is %d\n",nums);
    printf("val of nums[2] is%d\n", nums[2]); 
}

输入即 nums =[0,0,0,0,0]

以上代码的输出是

hellomy address is 16 
val of arr[2] is50
address is 16
val of arr[2] is30

我们在这里传递 sayHi(nums)?它仍然有效吗? nums 的地址在 someFunct 和 sayHi 中是否相同?

像 someFunct(&ptr) 这样传递 arg 只发生在结构上吗?

方法一

在这个方法中root指针被声明为main中的局部变量,指针的地址被传递给insert函数。这允许 insert 函数更改 main.

root 的值

此方法的缺点是它涉及 C 语言中一些最讨厌的语法,到处都是 *s 和 &s,以及过多的强制性括号。

void insert(node **root, int value)
{
    if (*root == NULL)
    {
        node *temp=malloc(sizeof(node));
        temp->val=value;
        temp->left=NULL;
        temp->right=NULL;
        *root = temp;
    }
    else
    {
        if((*root)->val > value)
            insert(&(*root)->left, value);
        else
            insert(&(*root)->right, value);
    }
}

int main(void)
{
    node *root=NULL;
    insert(&root,4);
    insert(&root,12);
    insert(&root,2);
    insert(&root,55);
    display(root);
}

方法二

与方法 1 类似,此方法也将 root 指针的地址传递给 insert 函数,但为了避免指针指向指针强加的一些令人讨厌的语法,一个本地指针 item 用于访问结构内容。这消除了方法 1 中所需的大部分 * 和括号。

这种方法的缺点是仍然有 & 散布在整个代码中,很容易忘记更新调用者指针的行 *root = temp;

void insert(node **root, int value)
{
    node *item = *root;
    if (item == NULL)
    {
        node *temp=malloc(sizeof(node));
        temp->val=value;
        temp->left=NULL;
        temp->right=NULL;
        *root = temp;
    }
    else
    {
        if(item->val > value)
            insert(&item->left, value);
        else
            insert(&item->right, value);
    }
}

int main(void)
{
    node *root=NULL;
    insert(&root,4);
    insert(&root,12);
    insert(&root,2);
    insert(&root,55);
    display(root);
}

方法三

在这个方法中,我们 return 来自 insert 函数的新 root 指针。因此,第一个函数参数可以是一个简单的指针。这消除了方法 1 中的讨厌语法。* 更少,绝对没有 &,也没有多余的括号。

此方法的缺点是需要将函数的 return 值分配给适当的指针。这导致 insert 函数中的一些赋值(在递归调用时),以及 main.

中的赋值
node *insert(node *root, int value)
{
    if (root == NULL)
    {
        root=malloc(sizeof(node));
        root->val=value;
        root->left=NULL;
        root->right=NULL;
    }
    else
    {
        if(root->val > value)
            root->left = insert(root->left, value);
        else
            root->right = insert(root->right, value);
    }
    return root;
}

int main(void)
{
    node *root=NULL;
    root = insert(root,4);
    root = insert(root,12);
    root = insert(root,2);
    root = insert(root,55);
    display(root);
}

样板文件

这是与上述任何方法中的 insertmain 函数结合使用时的代码,可提供一套完整的可编译代码和 运行.

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{   int val;
    struct node *left;
    struct node *right;
} node;

void display(node *root)
{
    if(root != NULL)
    {
        printf("%d\n", root->val);
        display(root->left);
        display(root->right);
    }
}