C 递归和遍历二叉树

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

我有以下树结构:

这一个显示了3个级别。我的实际问题将有8到12个级别。我有以下程序,我相信它将以正确的顺序遍历树。两个子节点向父节点报告。如果我们两个孩子都认识,我们就能找到父母。基本上,我们希望从右到左,从下到上遍历树。这些数字表示需要遍历节点的顺序

以下是我的代码,我相信可以实现这一点:

#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循环

三个问题:

  • 我将如何使用递归实现这一点
  • 有没有一种更具可伸缩性的方法来实现这一点而无需递归
  • 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.迭代和递归解决方案使用相同数量的内存:一堆连续记录。在这两种情况下,存储需求都是线性的,而不是指数型的。