从文本文件中查找Python树的深度

时间:2015-01-21 02:44:47

标签: python

我对python相对较新,当我遇到这个问题时,我正在尝试一些问题。树以下列方式在文本文件中定义,

d:
e:
b: d e
c:
a: b c

所以,我想写一个简单的python脚本来找到它的深度。我无法找到解决问题的策略。是否有任何算法或技术?

3 个答案:

答案 0 :(得分:2)

我的策略如下:

  1. 找到没有孩子的元素。
  2. 对于其中每一个,找到父母。确定是否有任何元素将此父级作为子级 - 如果不是,则长度为2(2)。
  3. 如果是,请找到父级的父级。重复步骤2,递增长度计数器。每个步骤都要继续更新计数器。
  4. 对于你的情况:

    d -> b -> a (len 3)
    e -> b -> a (len 3)
    c -> a (len 2)
    

    这可以被描述为“自下而上”的树构造方法/算法。

答案 1 :(得分:1)

您提供的树格式具有不错的属性:如果xy的孩子,则x在文件中y之前给出。因此,您只需循环浏览文件一次,然后将深度读入字典即可。例如:

depth = {}
for line in f:
    parent, children = read_node(line)
    if children:
        depth[parent] = max(depth.get(child,1) for child in children) + 1

然后只有print depth['a'],因为a是根。这里read_node是一个快速函数,用于从文件的一行解析父级和子级:

def read_node(line):
    parent, children = line.split(":")
    return parent, children.split()

答案 2 :(得分:1)

我不确定你的深度是什么意思,如果要访问每个节点需要多少步骤,你可以使用Depth-First Search来查看访问图中每个节点所需的时间

这是一个简单的实现:

text_tree = """d:
e:
b: d e
c:
a: b c"""

tree = {}

for line in text_tree.splitlines():
    node, childs = line.split(":")
    tree[node] = set(childs.split())

def dfs(graph, start):
    visited, stack = [], [start]
    while stack:
        vertex = stack.pop()
        if vertex not in visited:
            visited.append(vertex)
            stack.extend(graph[vertex])
    return visited

result = dfs(tree,"a")    
print "It took %d steps, to visit every node in tree, the path took was %s"%(len(result),result)

哪个输出:

It took 5 steps, to visit every node in tree, the path took was ['a', 'b', 'd', 'e', 'c']