递归函数的使用for循环的一个问题解决

下面的代码递归一个树的结构会有一个确定,就是当传入的节点是有右兄弟rightSibling时,该右兄弟子树是没有被遍历,因为是nodeTemp-rightSibling,而不是node->rightSibling;

void InitialGraph(Node *node)
{

	if(node!=NULL)
	{
		gltMakeCylinder(node->triangleBatch,node->start_radius, node->end_radius,node->length, 50, 10);
		
	}
	for(Node *nodeTemp=node->next ; nodeTemp!=NULL ; nodeTemp=nodeTemp->rightSibling)
	{

		InitialGraph(nodeTemp);
		
	}
	
}
 

 可能会觉得把nodeTemp->rightSiblint直接改成node->rightSibling;就可以解决了,但是事实是进入了一个死循环(可能有些百般不得其解,只是相当于把指针提前一个而已),因为 nodeTemp!=NULL ; nodeTemp=node->rightSibling始终执行这一for条件,使用执行循环体。究其问题的根本就是始终使用Node->rightSibling导致nodeTemp指针一直没有改变,而我们上面的代码为啥没有进入死循环呢,因为nodeTemp=nodeTemp->rightSibling不断对nodeTemp进行移动改变。

所以我们要修改这个问题只要做修改node的指针就行了,然后在注意一些细节……

 

 

void InitialGraph(Node *node)
{

	if(node!=NULL)
	{
		gltMakeCylinder(node->triangleBatch,node->start_radius, node->end_radius,node->length, 50, 10);
	}
	for(Node *nodeTemp=node->next ; nodeTemp!=NULL ; nodeTemp=node)
	{

		InitialGraph(nodeTemp);
		node=node->rightSibling;
		if(node==NULL)
			break;
	}
	
}
 

经过测试上面的代码还是有问题的,就是后面的节点会遍历多次。所以,循环和递归最好不要同时使用。也就证明了

数据结构与算法(C++版)/唐宁九中遍历树的算法其实是不严密的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值