需求
我们有如下的树型结构
想统一给这样的数据,添加目录索引,变成这样
我们知道从人眼看,只需要从上到下扫描就行了,可这要放在程序中可怎么写,人的思维和程序是不一样的。
其实这涉及到一个树的遍历问题,有两种方式可以实现
实现
方法一:逐层遍历添加大纲
比如第一层添加x,第二层添加x.x,第三层添加x.x.x,如下图
python实现
其实这种逐层扩散的遍历叫:“广度优先遍历”,对应的是迭代实现,python代码如下
def add_tree_index_iterative(tree_list):
if not tree_list:
return []
q = []
for i, v in enumerate(tree_list):
v[‘index‘] = i + 1
q.append(v)
while q:
v = q.pop(0) # 出队列
if v[‘children‘]:
for i, node in enumerate(v[‘children‘]):
node[‘index‘] = f‘{v["index"]}.{i + 1}‘
q.append(node) # 入队列
这其实借助了一个队列实现,python中的list的append和pop(0)分别对应了队列的入队和出队操作
方法二:深度遍历添加大纲
就是每次都走到头添加完了再回来
这种一次走到头的遍历叫:“深度优先遍历”,对应的是递归实现
python实现
def add_tree_index_recursive(tree_list, parent_index=""):
for i, v in enumerate(tree_list):
if not parent_index:
v[‘index‘] = i + 1
else:
v[‘index‘] = f‘{parent_index}.{i + 1}‘
if v[‘children‘]:
add_tree_index_recursive(v[‘children‘], v[‘index‘])