📅  最后修改于: 2023-12-03 15:39:42.134000             🧑  作者: Mango
有时候我们需要在一个树里面打印出给定级别的叶节点,比如在一个目录树中,我们可能只需要打印出第三级目录下的所有叶节点。这篇文章将介绍如何用 Python 实现这一功能。
为了打印出给定级别的叶节点,我们需要遍历整个树,并且记录每个节点的级别和它是否是叶节点。我们可以用一个字典来记录每个节点的级别和它的子节点,key 为节点的 ID,value 是一个列表,其中第一个元素是节点的级别,第二个元素是节点的子节点列表。
tree = {
1: [0, [2, 3]],
2: [1, [4, 5]],
3: [1, [6]],
4: [2, []],
5: [2, []],
6: [2, [7, 8]],
7: [3, []],
8: [3, []]
}
在上面的例子中,根节点的 ID 是 1,它的级别是 0,子节点是 2 和 3。节点 2 的级别是 1,子节点是 4 和 5。
在遍历整个树的过程中,我们需要对每个节点进行判断,如果是叶节点并且级别符合要求,就打印出来。如果不是叶节点,就递归遍历它的子节点。
下面是用 Python 实现的打印给定级别的叶节点的代码:
def print_tree(tree, level):
for node, data in tree.items():
node_level, children = data
if node_level == level and not children:
print(node)
elif children:
print_tree({c: tree[c] for c in children}, level)
该函数接受两个参数:一个字典表示树的结构,一个整数表示要打印的叶节点的级别。在函数内部,我们首先遍历整个树,并且获取每个节点的级别和子节点列表。然后,对每个节点进行判断:
print_tree
函数,把它的子节点作为参数传入。下面是示例代码,演示如何遍历一个目录树,并且打印出第三级目录下的所有文件:
import os
def scan_dirs(start, level=0):
tree = {}
for root, dirs, files in os.walk(start):
if level == 0:
node = os.path.abspath(root)
tree[node] = [0, []]
else:
base = os.path.basename(root)
parent = os.path.abspath(os.path.join(root, ".."))
if parent not in tree:
tree[parent] = [level-1, []]
node = os.path.abspath(root)
tree[node] = [level, []]
tree[parent][1].append(node)
for f in files:
path = os.path.abspath(os.path.join(root, f))
tree[node][1].append(path)
return tree
tree = scan_dirs('.')
print_tree(tree, 2)
该程序会遍历当前目录及其子目录,并且构建一个树的结构。然后,它调用 print_tree
函数打印出第三级目录下的所有文件。如果你把该程序保存为 print_leaf_nodes.py
并且在终端执行 python print_leaf_nodes.py
,你会得到一个列表,其中包含了所有第三级目录下的文件。