C 递归和遍历二叉树
我有以下树结构: 这一个显示了3个级别。我的实际问题将有8到12个级别。我有以下程序,我相信它将以正确的顺序遍历树。两个子节点向父节点报告。如果我们两个孩子都认识,我们就能找到父母。基本上,我们希望从右到左,从下到上遍历树。这些数字表示需要遍历节点的顺序 以下是我的代码,我相信可以实现这一点:C 递归和遍历二叉树,c,recursion,binomial-heap,C,Recursion,Binomial Heap,我有以下树结构: 这一个显示了3个级别。我的实际问题将有8到12个级别。我有以下程序,我相信它将以正确的顺序遍历树。两个子节点向父节点报告。如果我们两个孩子都认识,我们就能找到父母。基本上,我们希望从右到左,从下到上遍历树。这些数字表示需要遍历节点的顺序 以下是我的代码,我相信可以实现这一点: #include <stdio.h> int main(void) { for (int i = 0; i < 2; i++) { for (int
#include <stdio.h>
int main(void)
{
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
for (int k = 0; k < 2; k++)
{
printf("k loop: %d ", i * 7 + j * 3 + k);
}
printf("\n");
printf("j loop: %d \n", i * 7 + j * 3 + 2);
}
printf("i loop: %d \n", i * 7 + 6);
}
printf("final node: %d\n", 2 * 2 * 2 * 2 - 2);
}
#包括
内部主(空)
{
对于(int i=0;i<2;i++)
{
对于(int j=0;j<2;j++)
{
对于(int k=0;k<2;k++)
{
printf(“k循环:%d”,i*7+j*3+k);
}
printf(“\n”);
printf(“j循环:%d\n”,i*7+j*3+2);
}
printf(“i循环:%d\n”,i*7+6);
}
printf(“最终节点:%d\n”,2*2*2*2-2);
}
这不是很漂亮,也不是很可扩展,因为我需要为每个附加级别添加另一个for循环
三个问题:
对于
p(n,level)
,您可以通过以下步骤递归执行此操作:
- 如果
,首先用level>0
- 调用左子树的
n=p(n,级别-1)
- 调用右子树的
n=p(n,级别-1)
- 调用左子树的
- 然后打印
并返回n
n+1
#include <stdio.h>
int p(int n, int level) {
if (level > 0) {
n = p(n, level - 1);
n = p(n, level - 1);
}
printf("%i\n", n);
return n + 1;
}
// initial call for a depth of 8:
int main() {
p(0, 8);
return 0;
}
#包括
int p(int n,int level){
如果(级别>0){
n=p(n,1级);
n=p(n,1级);
}
printf(“%i\n”,n);
返回n+1;
}
//初始要求深度为8:
int main(){
p(0,8);
返回0;
}
这棵树总是完整的吗?或者某些节点只能有一个子节点?树可能不完整,因为父节点可能没有子节点,而一个节点(并且只有一个节点)可能只有一个子节点。例如,我可能有20个树结构,其中前19个有511个节点,最后一个可能只有205个节点,“从右到左,从下到上”有点难以解释,特别是当你画一棵树的时候:-)但是我很难找到一种方法来解释它,使它与你的程序一致。我猜你要找的是一棵树,它只是按顺序打印出数字0-510。不太好helpful@dcr:您的代码也按顺序打印数字0到14,并附带一些几乎没有用处的额外信息。您希望输出是什么样子?@dcr:您的程序也会按顺序输出数字0-14,尽管行上有一些变化。也许您需要将所需的枚举顺序添加到您的问题中。谢谢,您是对的。当我打印出级别时,我可以看到树被正确地遍历。谢谢。你的答案有效,但我很难理解如何:考虑P(0,2)。这不是首先要求p(0,1)吗?p(0,0)要求p(0,0)返回1。那么,为什么打印出来的第一个数字是=0(这是正确的),而不是1?1。所需的遍历是后序遍历,而不是有序遍历。2.迭代和递归解决方案使用相同数量的内存:一堆连续记录。在这两种情况下,存储需求都是线性的,而不是指数型的。