递归和遍历二叉树

时间:2020-08-30 16:14:50

标签: c recursion binomial-heap

我具有以下树结构:

enter image description here

此显示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);
}

这不是很好,也不是很可扩展,因为我需要为每个附加级别添加另一个for循环。

三个问题:

  1. 我该如何进行递归?
  2. 是否有更可扩展的方式来执行此操作而无需递归?
  3. 使用for循环方法或递归方法会更快

2 个答案:

答案 0 :(得分:2)

您可以通过针对p(n, level)的以下步骤来递归执行此操作:

  • 如果level > 0,则首先使用
    • 为左侧子树调用n = p(n, level - 1)
    • 为正确的子树调用n = p(n, level - 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;
}

答案 1 :(得分:0)

  1. 您要查找的内容称为有序遍历。通常它与树中的级别数无关,因为它是Depth-First Traversal的一种类型。

通常遵循以下算法

  1. 递归遍历左子树
  2. 访问根节点
  3. 递归遍历右子树

Here is a link for more information


  1. 完全有可能并且通常建议使用遍历树的迭代方法。尽管对于小树并没有真正感受到它的效果,但是对于大的递归遍历会占用指数级的内存空间。 Here is an example of in-order traversal using a stack on geekforgeeks

  1. 尽管您不会在一棵小树上注意到它,但是递归方法总是比迭代慢。
相关问题