【问题标题】:Algorithm for converting Category Tree to Flat List将类别树转换为平面列表的算法
【发布时间】:2012-05-30 11:24:42
【问题描述】:

我正在尝试将类别树转换为平面列表。

在类别中,任何类别都可以有 n 个级别的子类别。

For Ex.:

Category1
-SubCategory1
-SubCategory2
--SubCategor1
---SubCategory1
---SubCategory2
----SubCategory1
----SubCategory2
---SubCategory3
--SubCategory2
-SubCategory3

Category2
-SubCategory1
--SubCategory1
---SubCategory1
----SubCategory1
---SubCategory3
-SubCategory3

...etc and so on.

语言不是障碍我只是想制定循环/嵌套循环来创建此逻辑以将其转换为扁平列表。

我们将不胜感激。

提前致谢

【问题讨论】:

    标签: javascript c++ algorithm logic


    【解决方案1】:

    您的平面列表中的每个条目都将是您树的一个节点,因为根据深度优先搜索访问该节点。更多信息请see here

    编辑: 原始帖子被编辑了几次。最初,它看起来像 OP 在一个平面列表之后,因为那将是 BFS 的输出,但在后来的编辑之后,看起来 OP 在一个平面列表之后,因为那将是 DFS 的输出。更一般的情况是“平面列表的每个条目都将是 Tree 的一个节点,因为某个遍历函数(例如 BFS 或 DFS)会访问该节点。”

    【讨论】:

    • 谢谢 DFS 似乎是我想做的。但看起来它只适用于二叉树结构,但我正在寻找一个解决方案,即一棵树在任何阶段都可以有 n 个分支。
    • DFS 和 BFS 将遍历具有任意数量分支的节点的树。来自en.wikipedia.org/wiki/Depth-first_search#Pseudocode,请注意“for all edges e in G”部分。
    【解决方案2】:

    我不知道您所说的平面列表是什么意思,但是您可以使用堆栈(在实现方面,它可以是 STL 向量)在递归访问子类别时存储当前进度。

    我上面提到的“当前进度”应该存储你当前访问的是哪个子类,这样你返回时可以继续访问其他子类。

    如果你可以制定一个递归算法,你可以用这种形式重写它。

    【讨论】:

    • 谢谢,我所说的平面列表是指一个普通列表
    【解决方案3】:

    您可以使用递归 + std::copy 函数轻松完成此操作。

    【讨论】:

    • 层数过多时递归可能导致栈溢出。当层数已知时是可以接受的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多