获得后序树遍历的最佳算法

时间:2012-02-18 18:57:38

标签: algorithm tree tree-traversal

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

注:

  1. 算法不应考虑递归由于大量节点 可能导致StackOverFlow异常。
  2. 算法不应该考虑视图标志。
  3. 算法不应该弄乱树。我想要它原样。
  4. 算法应明智地使用内存。
  5. 在一个节点中,我可以得到我的父母。

2 个答案:

答案 0 :(得分:2)

parent的可用性允许迭代,没有堆栈:此算法假设每个节点都有Parent,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

enter image description here

答案 1 :(得分:0)

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

您可以找到代码here

的详细信息