如何优雅实现递归树打印:根节点无缩进且不新增参数
问题
希望重构递归树打印函数,让根节点(首次调用)完全不缩进。现有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
相关产品推荐
相关产品推荐

