二叉树的基本操作(创建、递归和非递归遍历、求深度、求叶子数)

本文介绍了二叉树的基本操作,包括如何创建二叉树,递归和非递归方式实现前序、中序、后序遍历,计算树的深度以及求解叶子节点数量。同时,还讨论了如何生成不同类型的二叉树,通过递归公式给出Catalan数序列。
摘要由CSDN通过智能技术生成

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;   // 编译器将提出警告 
} 
但这样可以:
char* getstring(int num)
{
    c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值