我正在制作Binary Tree是C。我知道如何制作Binary Tree,这不是这里的问题。
我在为根和将要添加到树中的所有元素使用空指针。
当二叉树为空(root指向NULL)时,我只是将根指向要成为树的第一个元素的元素。但是root并没有得到它应该指向的元素的地址。这只是一个简单的重新分配。
如上所述,我正在尝试对void指针进行简单的重新分配,以便为根分配新地址。
但是当我将元素的各个值分配给根时,一切似乎都工作得很好。
代表二叉树的所有元素。
public function scopePublished($query)
{
return $query->where('published_at', '<=', Carbon::now());
}
第一种方法:简单的重新分配失败
struct node {
void * key;
void * value;
struct node * left;
struct node * right;
};
第二种方法:分配个人价值很好
void map_tree_put(struct node * root, struct node * ele){
if(root==NULL) {
root = ele;
}
else {
/* some other code*/
}
}
测试代码
void map_tree_put(struct node * root, struct node * ele){
if(root==NULL) {
root->key = ele.key;
root->value = ele.value;
root->left = NULL;
root->right = NULL;
}
else {
/* some other code*/
}
}
答案 0 :(得分:1)
尝试
void map_tree_put(struct node ** root, struct node * ele){
if((*root)==NULL) {
(*root) = ele;
}
else {
/* some other code*/
}
}
,来自main
的呼叫应为
map_tree_put(&r, &ele);
这是关于按值和引用传递。
答案 1 :(得分:1)
那是因为在这段代码中:
void map_tree_put(struct node * root, struct node * ele){
if(root==NULL) {
root = ele;
}
else {
/* some other code*/
}
}
该函数接收指针的副本。为了使root
指针记住函数返回时的重新分配,您需要这样做:
void map_tree_put(struct node **root, struct node *ele){
if (root) {
if(*root==NULL) {
*root = ele;
}
else {
/* some other code*/
}
}
}