【发布时间】:2017-05-02 00:20:12
【问题描述】:
今天,我学习了 3 个针对有根树的 DFS(深度优先搜索)遍历,即 有序、前序和后序遍历。
例如,如果我考虑预购遍历,
typedef struct SiblingTreeNode {
struct SiblingTreeNode *parent;
void *item;
struct SiblingTreeNode *firstChild;
struct SiblingTreeNode *nextSibling;
} Node;
typedef struct LCRSTree {
Node *root;
int size;
} Tree;
void preOrderTraverse(Node * node) {
visit(node);
if (node->firstChild) {
printf("\n|");
preOrderTraverse(node->firstChild);
}
if (node->nextSibling) {
printf("-->");
preOrderTraverse(node->nextSibling);
}
}
void preOrder(Tree *tree) {
preOrderTraverse(tree->root);
}
然后按以下顺序访问节点,
实际用于 NMS(网络管理系统)应用程序,我们使用有根树(LCRS 表示)来维护网络元素(指标)的层次结构,叶节点的深度非常大。
渐近地,前序遍历的空间复杂度为O(d),其中d是最低叶子的深度。
在应用这 3 个遍历中的任何一个时,由于堆栈溢出,应用程序很有可能崩溃。
例如 - 如果您考虑访问节点序列(以上)调用堆栈从根到叶维护,当您访问第三个节点时。
使用上面给定的Tree 表示,在不维护显式数据结构(如堆栈)的情况下,如何在有根树上优化遍历算法?
注意:在构造中,Tree 看起来像 this
【问题讨论】:
标签: c algorithm data-structures tree traversal