C语言二叉树中的递归调用

最近正在学《C Primer Plus》,对于书中第十七章的二叉查找树部分的递归调用有些困惑,在查找了相关解释后,总算是明白了一点,和大家分享一下吧

首先,附上书中的部分代码:

//函数调用语句为:InOrder(ptree -> root, pfun)
//即最先传入函数的是指向树根节点的指针,而函数指针pfun指向的是printitem函数
static void InOrder(const Trnode * root, void (*pfun) (Item item))
{
	if(root != NULL)
	{
		InOrder(root -> left, pfun);
		(*pfun)(root -> item);
		InOrder(root -> right, pfun);
	}
}

void printitem(Item item)
{
	printf("Pet: %-19s Kind: %-19s\n", item.petname, item.petkind);
}

先解释一下上面代码中的一些表示符的含义:
在这里插入图片描述
在解释此段代码之前,我们先假设有如下所示一个二叉树:
在这里插入图片描述
现在我们再看代码:

static void InOrder(const Trnode * root, void (*pfun) (Item item))
{
	if(root != NULL)
	{
		InOrder(root -> left, pfun);//递归1
		(*pfun)(root -> item);
		InOrder(root -> right, pfun);//递归2
	}
}

首先root指向的是树根节点,即E节点,递归1递进一次,root指向根节点的左子节点,即B节点;

条件判断为真,递归1再递进一次,root指向B节点的左子节点,即A节点;
此时A节点后无子节点,root -> left == NULL,条件判断为假,递归1回归,root指向A节点,执行递归1后面的语句;

函数指针pfun打印A节点的信息,递归2递进,root -> right == NULL,条件判断为假,递归2回归,root指向A节点,递归1回归,root指向B节点,函数指针pfun打印B节点的信息;

递归2递进一次,root指向B节点的右子节点,即D节点,再递进一次,root -> right == NULL,条件判断为假,递归2回归,root指向D节点,执行递归1,root指向D节点的左子节点,即C节点,C节点后无子节点,执行递归1后面的语句,打印C节点的信息;

递归1回归,root指向D节点,打印D节点的信息,递归2回归,root指向B节点,递归1回归,root指向E节点,打印E节点的信息,至此左子树遍历完;

右子树的遍历参照上面的过程,不同的是root指向的节点顺序为E -> H -> F -> G -> F -> H -> I -> H -> E,而只有在递归1回归的过程中才能打印节点信息,所以打印节点信息的顺序为F -> G -> H -> I

我们可以根据上述过程绘制一个流程图:
在这里插入图片描述
以上就是关于二叉树中的递归调用,如果文中有错误,还请指正,谢谢!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值