下面的代码递归一个树的结构会有一个确定,就是当传入的节点是有右兄弟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;
}
}
经过测试上面的代码还是有问题的,就是后面的节点会遍历多次。所以,循环和递归最好不要同时使用。也就证明了