当前位置: 首页 > 知识库问答 >
问题:

具有巨大深度的根树-DFS遍历算法性能

蓬思博
2023-03-14

今天,我学习了根树的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(网络管理系统)应用程序中,我们使用根树(LCRSrepresentation)来维护网络元素(度量)的层次结构,其中叶节点的深度非常大。

渐近地,预序遍历的空间复杂度是O(d),其中d是最低叶的深度。

在应用这三种遍历中的任何一种时,由于堆栈溢出,应用程序很有可能崩溃。

例如-如果考虑访问节点序列(如上所述),则在访问第三节点时从根到叶维护调用堆栈。

使用上面给定的Tree表示,在不维护显式数据结构(如堆栈)的情况下,如何优化根树上的遍历算法?

注意:在构造时,如下所示

共有1个答案

敖淮晨
2023-03-14

前序遍历有一个非递归的解决方案,它在递归中使用调用堆栈的堆栈数据结构。如果内存仍然是一个问题,您可以设计一个堆栈来将其中的一部分卸载到存储中,并在需要时重新加载它。

void iterativePreorder() {
    TreeNode top;
    if (root == null)
        return;

    Stack<SiblingTreeNode> st = new Stack<SiblingTreeNode>();
    st.push(root);

    while (!st.empty()) {
        top = st.pop();
        //do traversal effect
        if (top.right != null)
            st.push(top.right);
        if (top.left != null)
            st.push(top.left);
    }
}
 类似资料:
  • 给定一个数组,构建二叉树,并且按层次打印这个二叉树

  • 本文向大家介绍Python实现深度遍历和广度遍历的方法,包括了Python实现深度遍历和广度遍历的方法的使用技巧和注意事项,需要的朋友参考一下 深度遍历: 原则:从上到下,从左到右 逻辑(本质用递归): 1)、找根节点 2)、找根节点的左边 3)、找根节点的右边 广度遍历: 核心:队列+递归 以上这篇Python实现深度遍历和广度遍历的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希

  • def deep(root): if not root: return print root.data deep(root.left) deep(root.right) if __name__ == '__main__': lookup(tree) deep(tree)

  • 主要内容:src/runoob/binary/Traverse.java 文件代码:二分搜索树遍历分为两大类,深度优先遍历和层序遍历。 深度优先遍历分为三种:先序遍历(preorder tree walk)、中序遍历(inorder tree walk)、后序遍历(postorder tree walk),分别为: 1、前序遍历:先访问当前节点,再依次递归访问左右子树。 2、中序遍历:先递归访问左子树,再访问自身,再递归访问右子树。 3、后序遍历:先递归访问左右子树,再访问自身节

  • 我有一个任务,我必须写一个方法,执行有向图的DFT。以下是有向边: 节点2-->节点4 节点3-->节点5 节点4-->节点5

  • web上有很多内容指出有四种树遍历算法: 深度优先搜索-无序(左-根-右) 预购(根-左-右) 后序(左-右-根) 广度优先搜索-级别顺序遍历 这些树遍历是由于二叉搜索树的概念获得的吗?(即,左子树比右子树小,因此我们在右之前遍历左?) 那么其他树遍历的组合呢?例如:右根左,右根左,右根左,按级别顺序从右节点开始遍历? 如果上述树遍历组合有效,那么树遍历的时间复杂度相对于其左前对应项是否保持不变?