python数据结构--一个先序遍历缩进输出文档目录表的例子

参考:《数据结构与算法–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'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值