这是插入/创建二叉树的代码吗?但是 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
函数更改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 中所需的大部分 *
s 和括号。
这种方法的缺点是在整个代码中仍然散布着&
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 更少,绝对没有 &
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);
样板
当与上述任何方法中的insert
和main
函数结合使用时,以下代码可提供一整套可编译和运行的代码。
#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() 函数没有显示任何东西?我错过了啥?的主要内容,如果未能解决你的问题,请参考以下文章