下面的代码递归一个树的结构会有一个确定,就是当传入的节点是有右兄弟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++版)/唐宁九中遍历树的算法其实是不严密的。
分享到:
相关推荐
递归函数是指函数在执行过程中调用自身,每次调用都会产生一个新的子问题,直到子问题足够简单,可以直接求解,然后逐层返回结果,最终解决原始问题。递归的关键在于必须有一个明确的基本结束条件(也称为递归基),...
在处理`for`循环时,我们会定义一个或多个递归函数来识别`for`语句的各个部分,如初始化、条件检查、更新等。 ```markdown 1. 函数 forStatement(): - 解析 "for" 关键字 - 调用 initExpression() 解析初始化...
递归函数必须满足两个条件:一是存在基本情况(base case),即问题可以直接求解而不需要进一步的递归;二是其他情况(recursive case)会将问题简化为规模更小的同类问题,直到达到基本情况为止。递归的核心在于...
在PHP编程语言中,递归函数是一种特殊类型的函数,它会调用自身来解决复杂问题。递归通常用于处理树形结构、遍历目录、计算阶乘、解决斐波那契序列等。在这个主题中,我们将深入探讨PHP递归函数的工作原理、优缺点...
递归下降法是基于函数递归的解析策略,每个非终结符对应一个解析函数,当解析到特定的文法规则时,会调用相应的函数进行处理。这种方法直观、易于理解,特别适用于LL(1)类型的文法。 在C++中,for语句的基本结构...
在处理FOR循环时,递归下降法会定义一个或多个函数来对应FOR循环的各个部分,如初始化、条件检查、循环体和更新。例如: ```python def parse_for(): parse("for") parse("(") init = parse_init() cond = ...
以下是一个使用C++实现的递归Fibonacci函数的示例: ```cpp #include using namespace std; int fibonacci(int n) { if (n ) { return n; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } int ...
斐波那契数列是一个经典的数学概念,在计算机科学中经常被用作算法示例和问题解决的工具。这个数列的定义是这样的:第一项F0等于0,第二项F1等于1,从第三项开始,每一项都等于前两项之和。即Fn = Fn-1 + Fn-2 (n >=...
MyBatis是一个功能强大且灵活的持久层框架,它支持自查询和递归查询,下面我们将探讨如何使用MyBatis实现 N级联动效果。 递归查询 递归查询是指在一个查询中调用自身的查询,以便实现某些复杂的查询逻辑。在...
该程序是一个典型的使用递归实现素因子分解的例子,展示了如何通过递归算法高效地解决数学问题,并且通过C语言的具体实现加深了对递归原理的理解。此外,程序还涉及到了数组、循环以及基本的输入输出操作等C语言基础...
由于这是一个穷举法解决问题的例子,输出将列出所有符合条件的球员位置分配情况。 #### 3. 下楼梯问题 本问题要求计算从顶部到底部的不同走法数量,每次可以跳1、2或3个台阶。 **代码解析:** ```c #include #...
递归下降解析器通过一系列递归函数来匹配输入的符号串,每个函数对应文法的一个非终结符。当解析到一个非终结符时,解析器会尝试调用相应的函数,直到遇到终结符或达到文法的起始符号。这种方法简单直观,但可能因...
在处理FOR循环时,我们使用递归函数来匹配并解析每种循环结构。每个函数对应于一个语法构造,当遇到匹配的输入时,函数被调用,如果遇到子构造,则递归调用相应的函数。递归下降法简单且易于实现,但可能会遇到左...
例如,一个简单的for循环可以用来遍历数组: ```python for i in range(len(array)): process(array[i]) ``` **递归的实现** 递归则常用于处理分治策略的问题,如树的遍历、斐波那契数列等。以计算阶乘为例: `...
然后通过一个for循环,我们可以计算Fibonacci数列的前20项的平方和,并与第20项和第21项的乘积进行比较,以验证其特定性质。 递归调用在解决某些问题时非常有效,但需要注意的是,由于每次递归调用都会增加函数调用...
在Java中编写递归函数时,需要注意两个关键点:**基本情况**(base case)和**递归情况**(recursive case)。 - **基本情况**:这是递归结束的条件。对于阶乘来说,基本情况通常是`n == 0`时返回`1`。 - **递归...
例如,以下是一个计算阶乘的循环示例: ```cpp int CalcFactorial(int n) { int result = 1; int i; for(i = 1; i ; i++) { result = result * i; } return result; } ``` 递归则采用自调用的方式,通常包含...
递归在解决分治策略、树遍历等问题时特别有用,而非递归算法则更适合处理那些可以通过简单循环解决的问题。 总结来说,C++中的递归算法和非递归算法各有优势和应用场景。在实际编程中,理解这两种方法的原理,结合...