我有一棵包含大量节点的树,希望寻找最佳后序遍历算法。
注意:
注意:
- 该算法不应考虑递归,因为大量节点可能导致堆栈溢出异常。
- 该算法不应考虑视图标志。
- 该算法不应对树结构进行更改,我需要它保持原样。
- 算法应明智地使用内存。
- 在一个节点中,我可以获取父节点的信息。
有了父节点的可用性,可以进行迭代而不需要使用堆栈:该算法假设每个节点都有父节点、第一个子节点和下一个兄弟节点。
#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。