【问题标题】:Best Algorithm to get a Post-order Tree Traversal获得后序树遍历的最佳算法
【发布时间】:2012-02-18 18:57:38
【问题描述】:

我有一棵包含大量节点的树,我试图获得最佳的后序遍历算法。

注意:

  1. 由于节点数量多,算法不应该考虑递归 可能会导致 StackOverFlow 异常。
  2. 算法不应考虑视图标志。
  3. 算法不应该与树混淆。我想要它原来的样子。
  4. 算法应该明智地使用内存。
  5. 在节点中我可以得到我的父节点。

【问题讨论】:

  • 除非你的树实际上有数千层深,否则递归应该不是问题。
  • 顺便问一下,您已经考虑过并尝试过什么?如果树的深度足以吃掉你所有的筹码,继续传递就是你的朋友。考虑以下堆栈溢出问题的答案:stackoverflow.com/questions/9323036/…
  • Just Traversing an Abstract Syntax Tree.. + 我读了这篇文章,我想问是否有人为后序遍历解决了这个问题“1968 年,Knuth 提出了设计无堆栈标签的问题- 免费的非递归算法,按顺序遍历树,而最终保持不变。”

标签: algorithm tree tree-traversal


【解决方案1】:

父节点的可用性允许在没有堆栈的情况下进行迭代:此算法假设每个节点都有父节点、FirstChild、NextSibling

#include <stdio.h>

struct Node {
    int Data; Node *FirstChild, *NextSibling, *Parent;
};

void use_data(Node *node) {
    printf("%d\n", node->Data);
}

int main_visit_post(int, char **) {
    Node G[] = {
        {0, G+1,   0,   0},
        {1, G+2, G+3, G+0},
        {2,   0, G+4, G+1},
        {3, G+8,   0, G+0},
        {4, G+5, G+7, G+1},
        {5,   0, G+6, G+4},
        {6,   0,   0, G+4},
        {7,   0,   0, G+1},
        {8, G+9,   0, G+3},
        {9,   0,   0, G+8},
    };

    Node *node = G, *next;
    while (node) {
        next = node->FirstChild;
        if (!next) {
            use_data(node);
            next = node->NextSibling;
            if (!next) {
                while (node->Parent) {
                    next = node->Parent;
                    use_data(next);
                    if (next->NextSibling) {
                        next = next->NextSibling;
                        break;
                    }
                    else {
                        node = next;
                        next = 0;
                    }
                }
            }
        }
        node = next;
    }
    return 0;
}

这棵树得到这个序列:2,5,6,4,7,1,9,8,3,0

【讨论】:

    【解决方案2】:

    不使用标志或递归解决此问题的一种方法是简单地使用堆栈。 对于后序,我们可以使用两个堆栈。 一个堆栈用于操作输入,另一个堆栈用于生成输出。

    你找到代码here的详细信息

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多