C 带指针到指针的二叉树递归插入

C 带指针到指针的二叉树递归插入,c,pointers,recursion,data-structures,tree,C,Pointers,Recursion,Data Structures,Tree,或 如果我的理解有误,请纠正我。我是个新手。谢谢。这是因为树可以为空(NULL)。在这种情况下,可以设置外部指针,使其指向新的根 insert(tree->right, val); // assuming definisiton as void insert(node *tree, int val); 请记住,在C中,参数是按值传递的,这意味着作为参数传递的表达式的值会复制到函数中。因此,如果在函数中更改参数,则只更改副本,调用方将看不到更改(即更改丢失) 为了克服这个问题,您可以通过传


如果我的理解有误,请纠正我。我是个新手。谢谢。

这是因为
树可以为空(
NULL
)。在这种情况下,可以设置外部指针,使其指向新的根

insert(tree->right, val); // assuming definisiton as void insert(node *tree, int val);

请记住,在C中,参数是按值传递的,这意味着作为参数传递的表达式的值会复制到函数中。因此,如果在函数中更改参数,则只更改副本,调用方将看不到更改(即更改丢失)

为了克服这个问题,您可以通过传递指针来模拟按引用传递。如果要更改指针,则必须将指针传递给该指针

如果查看
插入
函数,您将看到当
*树
(即,没有节点)时,它会分配给指针。如果不将指针传递给指向节点的指针,则该操作将不起作用


愚蠢的例子:

node *root = NULL;
insert(root, 10);
#包括
void func1(常量字符*s)
{
s=“来自func1的您好”;
}
void func2(常量字符**s)
{
*s=“来自func2的您好”;
}
内部主(空)
{
const char*s1=“foo”;
const char*s2=“bar”;
func1(s1);/*按值传递指针*/
func2(&s2);/*通过“引用”传递指针*/
printf(“s1=\%s\”\n,s1);
printf(“s2=\%s\”\n,s2);
}
上面的小示例程序将打印出来

#include <stdio.h>

void func1(const char *s)
{
    s = "hello from func1";
}

void func2(const char **s)
{
    *s = "hello from func2";
}

int main(void)
{
    const char *s1 = "foo";
    const char *s2 = "bar";

    func1(s1);   /* Passing pointer by value */
    func2(&s2);  /* Passing pointer by "reference" */

    printf("s1 = \"%s\"\n", s1);
    printf("s2 = \"%s\"\n", s2);
}
s1=“foo” s2=“func2的您好”
传递给函数的两种类型:

一,。传递值=创建值的副本。一旦函数终止,对值的任何更改都将丢失。

二,。Pass by reference=不创建副本,但指向要传递的值。如果发生更改,则该值将更改


双指针(**)指向单个指针(*)的地址。因此,如果将单指针传递给函数,则需要使用双指针来更改单指针的值(地址)。否则,就没有变化。

如果
val
等于
(*tree)->数据会怎么样呢?
?同样,如果我们将指针传递到头部,即节点*tree,那么我们可以将空指针检查为tree!=空,不是吗???@CodeWithPride问题不在于检查
NULL
,而是赋值问题。@CodeWithPride我在我的答案中添加了一个小而简单的例子来说明区别。谢谢你的例子。。现在说清楚了。。非常感谢:)
node *root = NULL;
insert(root, 10);
#include <stdio.h>

void func1(const char *s)
{
    s = "hello from func1";
}

void func2(const char **s)
{
    *s = "hello from func2";
}

int main(void)
{
    const char *s1 = "foo";
    const char *s2 = "bar";

    func1(s1);   /* Passing pointer by value */
    func2(&s2);  /* Passing pointer by "reference" */

    printf("s1 = \"%s\"\n", s1);
    printf("s2 = \"%s\"\n", s2);
}
s1 = "foo" s2 = "hello from func2"