这是插入/创建二叉树的代码吗?但是 display() 函数没有显示任何东西?我错过了啥?

Posted

技术标签:

【中文标题】这是插入/创建二叉树的代码吗?但是 display() 函数没有显示任何东西?我错过了啥?【英文标题】:This is the code for inserting/creating a binary tree? but the display() function is not displaying anything? what am I missing?这是插入/创建二叉树的代码吗?但是 display() 函数没有显示任何东西?我错过了什么? 【发布时间】:2021-12-27 05:16:00 【问题描述】:

有一个插入函数,它递归地插入到树中并显示函数用于显示输出。 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)? 它仍然有效吗? someFunct和sayHi中nums的地址是一样的吗?

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

【问题讨论】:

问题是全局变量struct node *root=NULL;被函数参数insert(node *root, ...)遮蔽了。 root=temp; 行更改了参数的值。它不会改变全局变量的值。所以main使用的root总是NULL。 User### 是对的:'*root1' 需要是'**root1'。 @user3386109 为什么会这样?不是已经是指针了吗?它必须通过引用传递? 如果要在函数中更改指针的值,则需要将指针的地址传递给函数。我添加了一个答案,它显示了两种方法来做到这一点。答案还显示了如何在不使用指针到指针参数的情况下完成任务。 【参考方案1】:

方法一

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

这种方法的缺点是它涉及 C 语言中一些最讨厌的语法,*s 和 &amp;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 中所需的大部分 *s 和括号。

这种方法的缺点是在整个代码中仍然散布着&amp;s,很容易忘记更新调用者指针的*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);

方法3

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

此方法的缺点是需要将函数的返回值分配给适当的指针。这会导致 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);
    

【讨论】:

好的!它消除了很多混乱......还有一个问题......当我们分配数组并传递它们时,我们不会像 someFunct(&arr) 那样传递,我们只是传递 someFunct(arr)?为什么会这样? 我已经编辑了问题并添加了我想问的 arr 的代码部分?令人困惑的是,为什么对于 root 我们传递了`insert(&root)`,而当我必须传递一个数组时,`someFunct(nums)` 也起作用了? @user3386109

以上是关于这是插入/创建二叉树的代码吗?但是 display() 函数没有显示任何东西?我错过了啥?的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的创建,插入,查找和比较

数据结构 二叉树

平衡二叉树的定义及基本操作(查找插入删除)及代码实现

平衡二叉树的插入与实现

数据结构 二叉树

Java实现二叉树的创建和遍历操作(有更新)