我有一个包含大量节点的树,我试图获得最佳的后序遍历算法。
注:
答案 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
答案 1 :(得分:0)
在不使用标志或递归的情况下解决此问题的一种方法就是使用堆栈。 对于后期订单,我们可以使用两个堆栈。 一个堆栈用于操作输入,另一个堆栈用于生成输出。
您可以找到代码here
的详细信息