作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
到目前为止,程序已经足够简单:由包含整数值的节点以及指向节点左右分支的指针组成的二叉树。
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int val;
struct node *left;
struct node *right;
} Node;
void insert(Node *root, int val);
int main(void){
Node *root = NULL;
insert(root, 5);
insert(root, 3);
printf("%d\n", root->val);
return 0;
}
void insert(Node *root, int val){
if(root == NULL){ // Create tree if root is empty
root = malloc(sizeof(struct node));
root->val = val;
root->left = NULL;
root->right = NULL;
} else if(val < root->val){ // branch to left of tree if new value is less than root value
if(root->left == NULL){
root->left = malloc(sizeof(struct node));
}
root->left->val = val;
} else if(val > root->val){ // branch to right of tree if new value is greater than root value
if(root->right == NULL){
root->right = malloc(sizeof(struct node));
}
root->right->val = val;
}
}
无论出于什么原因,插入都很顺利。我可以输入 5 和 3 (任意)。但我无法打印出 root->val 中应有的值“5”?程序完全崩溃了。我是不是忽略了什么?
最佳答案
问题出在insert
的签名中:
void insert(Node *root, int val);
它不可能将 NULL
作为 root
参数,因为它无法传回函数内部发生的更改。 insert
内对 root
的任何修改都保留在 insert
本地,因为指针是按值传递的,即复制。
对于一个好的签名,您有两种一般选择:
insert
返回新的 root
,即 Node *c
如果使用此方法,调用者将需要进行如下调用: root = insert(root, 5);
或 Node**
而不是Node*
,即void insert(Node **root, int val);
如果你使用这个方法,调用者需要进行如下调用:insert(&root, 5)
。当然,insert
的实现也需要更改,因为额外的间接级别需要额外的取消引用。关于尝试打印二叉树根部的值时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43461968/
我是一名优秀的程序员,十分优秀!