参考:《数据结构与算法–python语言实现》P221,代码段8-24
看了半天没看懂,最后课本上一个例子还有一个需要用到它,没办法,一步步拆解了。
def preorder_label(self, T, p, d, path):
"""
是这样的:假设这棵树只有一个根节点,两个子节点,一个左一个右孩子
初始执行preorder(T, self.root(), 0, [])
我先分析一下path
开始根节点为[]
接着运行一下函数[0]
再开始self.preorder_indent(T, c1, 1, [0])
在这个函数开始时,会再append一个0 path [0] -> [0, 0]
因为c1(左孩子)没有孩子,所以for循环不执行,
直接来到最后一行path: [0, 0] -> [0]
所以preorder得到的结果path: [0]
这里来到第一次根节点的第一个for循环,刚上面讲的去进行第一个递归了
上面得到的path: [0]
后面还有一个path[-1] += 1, path: [0] -> [1]
接着执行第二个递归preorder(T, c2, 1, [1])
path.append(0), path:[1] -> [1, 0]
for循环不执行
path.pop(), path:[1, 0] -> [1]
以上返回的结果来到for循环的第二次,即到达preorder(....)之后
path[-1] += 1, path: [1] -> [2]
for 循环结束,最后path.pop(), path:[2] -> []
一个流程结束后,path的任务也就完成,没了
"""
label = '.'.join(str(j+1) for j in path)
print(2*d*' ' + label, p.element())
# 为一个孩子作准备
path.append(0)
for c in T.children():
self.preorder_indent(T, c, d+1, path)
path[-1] += 1
path.pop()
最后输出:
根节点
(两个空格) 左节点元素
(两个空格) 右节点中元素
其实只要是将path的更新明白了之后,就知道整个流程中的序号是怎样输出的了。
另外加上一个
'.'.join(str(s) for s in [])
# 输出:''
'.'.join(str(s) for s in [1])
# 输出:'1'
'.'.join(str(s) for s in [1, 2])
# 输出:'1.2'