1 创建
递归地调用即可
void init_tree(node** p)
{
int elm;
scanf("%d", &elm);
if(elm)
{
*p = (node*)malloc(sizeof(node));
(*p) -> data = elm;
printf("create %d node's left child: ", (*p) -> data);
init_tree(&(*p) -> left);
printf("create %d node's right child: ", (*p) -> data);
init_tree(&(*p) -> right);
}
else
{
*p = NULL;
return;
}
}
顺便注意一下,C中指针作为函数的参数和返回值
在上面的函数中传递的是一个指向指针的指针,以使函数中使用malloc来动态地分配空间。
如果直接使用指针则不行,因为编译器要为每个函数参数制作临时副本,对于指针也不例外,它的副本即是实参所指向对象的内存地址,如果函数中修改了形参指向的内容,实参所指向的内容也作了相应的修改,这就是为什么指针可以用作输出参数的原因。但是对于上例中,形参直接开辟了新的内存空间,它所指向的内存地址已经改变了,而实参的指向却丝毫没变,还会造成内存泄漏。解决方法就是用一个指向实参指针的指针作为形参,是p指向root这个指针(而不是root的副本),这时,动态分配的空间传给了*p,而这个*p就是root,所以实现了为root分配空间。
也可以用另一个方法实现内存动态分配
char* GetMemory(int num)
{
char* p = (char*)malloc(num*sizeof(char));
return p;
}
void Test(void) {
char *str = NULL;
str = GetMemory(100);
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
还有一点就是,一定不能返回指向栈内存的指针,如
char *GetString(void)
{
char p[] = "hello world";
return p; // 编译器将提出警告
} 但这样可以

本文介绍了二叉树的基本操作,包括如何创建二叉树,递归和非递归方式实现前序、中序、后序遍历,计算树的深度以及求解叶子节点数量。同时,还讨论了如何生成不同类型的二叉树,通过递归公式给出Catalan数序列。
最低0.47元/天 解锁文章
5169

被折叠的 条评论
为什么被折叠?



