【发布时间】:2011-08-29 21:04:35
【问题描述】:
我有一个用于构建树的缩进文本文件。每行代表一个节点,缩进代表深度以及当前节点是其子节点。
例如,一个文件可能看起来像
根 节点1 节点2 节点3 节点4 节点5 节点6表示ROOT包含三个孩子:1、5、6,Node1有一个孩子:2,Node2有一个孩子:3,以此类推
我提出了一个递归算法并对其进行了编程并且它可以工作,但它有点难看,特别是非常粗略地处理上面的示例(从节点 4 到节点 5 时)
它使用“缩进计数”作为递归的基础,所以如果缩进数 = 当前深度 + 1,我会更深一层。但这意味着当我读到缩进较少的一行时,我必须一次返回一个级别,每次都检查深度。
这就是我所拥有的
def _recurse_tree(node, parent, depth):
tabs = 0
while node:
tabs = node.count("\t")
if tabs == depth:
print "%s: %s" %(parent.strip(), node.strip())
elif tabs == depth + 1:
node = _recurse_tree(node, prev, depth+1)
tabs = node.count("\t")
#check if we have to surface some more
if tabs == depth:
print "%s: %s" %(parent.strip(), node.strip())
else:
return node
else:
return node
prev = node
node = inFile.readline().rstrip()
inFile = open("test.txt")
root = inFile.readline().rstrip()
node = inFile.readline().rstrip()
_recurse_tree(node, root, 1)
现在我只是打印出节点以验证父节点对于每一行是否正确,但也许有更简洁的方法来做到这一点?尤其是当我从每个递归调用返回时 elif 块中的情况。
【问题讨论】:
-
您将不得不编写一堆代码来正确解析和验证。可以用xml吗?它的基础结构是一棵树。
-
很遗憾,没有,因为这更像是一个递归练习。我认为这种问题会很常见。
-
这可能是一个家庭作业问题吗?如果是这样,添加作业标签是礼仪。
-
不,个人兴趣。好久没做递归了。
-
如果是这样,这真的不是 Python 特定的。更多的是一般算法的思考。
标签: python algorithm recursion tree