You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅实现递归树打印:根节点无缩进且不新增参数

问题

希望重构递归树打印函数,让根节点(首次调用)完全不缩进。现有Python代码如下:

Tree = dict[str, 'Tree']
def print_tree(tree: Tree, prefix: str=''):
    if not tree:
        return
    markers = [('├── ', '│   '), ('└── ', '    ')]
    children = list(tree.items())
    for key, subtree in children:
        is_last_child = (key, subtree) == children[-1]
        key_prefix, subtree_prefix = markers[is_last_child]
        print(prefix + key_prefix + key)
        print_tree(subtree, prefix + subtree_prefix)

tree = {'.': {'alpha':{}, 'beta': {'beta.alpha':{}, 'beta.beta':{}}, 'charlie': {'charlie.alpha':{}, 'charlie.beta':{}, 'charlie.charlie':{}}, 'delta':{}}}
print_tree(tree)

当前输出:

└── .
    ├── alpha
    ├── beta
    │   ├── beta.alpha
    │   └── beta.beta
    ├── charlie
    │   ├── charlie.alpha
    │   ├── charlie.beta
    │   └── charlie.charlie
    └── delta

期望输出:

.
├── alpha
├── beta
│   ├── beta.alpha
│   └── beta.beta
├── charlie
│   ├── charlie.alpha
│   ├── charlie.beta
│   └── charlie.charlie
└── delta

不想新增额外参数或状态信息,希望通过调整递归方式实现,保持函数简洁。

解决方案

简洁修改版

直接利用首次调用时prefix为空的特性,区分根节点和子节点的处理逻辑,代码如下:

Tree = dict[str, 'Tree']
def print_tree(tree: Tree, prefix: str=''):
    if not tree:
        return
    children = list(tree.items())
    markers = [('├── ', '│   '), ('└── ', '    ')]
    for idx, (key, subtree) in enumerate(children):
        is_last_child = idx == len(children) - 1
        # 首次调用(prefix为空)时直接打印根节点key
        if prefix == '':
            print(key)
            # 递归处理根节点的子树,传入对应前缀
            _, subtree_prefix = markers[is_last_child]
            print_tree(subtree, subtree_prefix)
        else:
            # 非根节点保持原有逻辑
            key_prefix, subtree_prefix = markers[is_last_child]
            print(prefix + key_prefix + key)
            print_tree(subtree, prefix + subtree_prefix)

tree = {'.': {'alpha':{}, 'beta': {'beta.alpha':{}, 'beta.beta':{}}, 'charlie': {'charlie.alpha':{}, 'charlie.beta':{}, 'charlie.charlie':{}}, 'delta':{}}}
print_tree(tree)

思路说明

  • 借助默认参数prefix初始为空的特点,判断是否是首次调用
  • 首次调用时直接打印根节点的key,然后递归处理它的子节点,此时只需要传递子节点对应的前缀(不需要给根节点加符号)
  • 非首次调用的递归逻辑完全保留原代码的处理方式,这样既没新增参数,也实现了根节点无缩进的需求

内容的提问来源于stack exchange,提问作者user3310334

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:10:26