【问题标题】:Implement depth first tree traversal with stack in Python在 Python 中使用堆栈实现深度优先树遍历
【发布时间】:2019-05-13 15:09:09
【问题描述】:

如果给定一个 JSON 位置列表,例如:

locations = [
  {"id": 1, "name": "San Francisco Bay Area", "parent_id": None},
  {“id": 2, "name": "San Jose", "parent_id": 3},
  {"id": 3, "name": "South Bay", "parent_id": 1},
  {"id": 4, "name": "San Francisco", "parent_id": 1},
  {"id": 5, "name": "Manhattan", "parent_id": 6},
  {"id": 6, "name": "New York", "parent_id": None}
]

我希望能够生成位置列表,子位置在其父级下分组,并按字母顺序,还用连字符缩进子位置。每个深度级别应按字母顺序排序,最多可以有 5 个深度级别。所以上面的输出是:

New York
-Manhattan
San Francisco Bay Area
-San Francisco
-South Bay
--San Jose

似乎遍历这些位置是有意义的,只要“parent_id”为 None,我们就知道这是树的根,因此执行深度优先遍历。找到它的子节点(只要“parent_id”等于这个 id),使用堆栈来跟踪它们并每次递增级别/按字母顺序为节点的所有子节点排序。

如何实现树(节点+子节点)的创建和堆栈的遍历(同时跟踪级别以添加连字符和排序)?

你会直接遍历 JSON 做这个过程还是创建一个单独的结构实现和树然后做?对于这些不同的步骤中的一些代码,我将不胜感激 - 我知道如何解决它,我只是不清楚确切的实现。

【问题讨论】:

  • 这不是一个 二叉树 搜索树,因为每个节点可以有超过 2 个子节点。
  • 抱歉,您的问题中没有提到任何关于二叉树的内容。我将从这里开始:stackoverflow.com/questions/2598437/…
  • 不,我的观点是,这个问题的解决方案不会涉及二叉树(您发布的两个链接都是用于二叉树的)——在这种情况下,每个节点可以有超过 2 个子节点。我想知道如何将 JSON 列表转换为树结构,然后对其进行深度优先遍历,以便按字母顺序对每个级别进行排序并在每个级别后添加一个连字符。
  • 对不起,我误解了 - 点了。研究有向无环图结构深度优先遍历算法实现。

标签: python json tree stack


【解决方案1】:

您可以从给定的数据构建这个“树”,如下所示:

locations = [
    {"id": 1, "name": "San Francisco Bay Area", "parent_id": None},
    {"id": 2, "name": "San Jose", "parent_id": 3},
    {"id": 3, "name": "South Bay", "parent_id": 1},
    {"id": 4, "name": "San Francisco", "parent_id": 1},
    {"id": 5, "name": "Manhattan", "parent_id": 6},
    {"id": 6, "name": "New York", "parent_id": None}
]

def find_children(parent, locations):
    branch = {}
    for location in locations:
        if location["parent_id"] == parent:
            children = find_children(location["id"], locations)
            branch[location["name"]] = children
    return branch

tree = find_children(None, locations)
print(tree)

打印出来的

{'San Francisco Bay Area': {'San Francisco': {}, 'South Bay': {'San Jose': {}}}, 'New York': {'Manhattan': {}}}

然后可以对tree的内容进行排序打印:

def print_tree(tree, level=0):
    branches = sorted(list(tree.keys()))
    for branch in branches:
        print("-" * level + branch)
        print_tree(tree[branch], level + 1)

print_tree(tree)

打印出来的

New York
-Manhattan
San Francisco Bay Area
-San Francisco
-South Bay
--San Jose

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多