首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-09-12 
递归函数的使用for循环的一个问题解决下面的代码递归一个树的结构会有一个确定,就是当传入的节点是有右兄

递归函数的使用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++版)/唐宁九中遍历树的算法其实是不严密的。

热点排行