网上很多代码都是二叉树的遍历,我需要把遍历后的路径保存下来,怎么办?
下面的代码针对非二叉树也可以使用。
递归实现
def gen_tree_paths(tree, path=None):
if path is None:
path = []
if 'children' in tree and tree.get('children'):
paths = []
for child in tree['children']:
paths.extend(gen_tree_paths(child, path + [tree['id']]))
return paths
else:
return [path + [tree['id']]]
非递归实现
def get_tree_paths(tree):
paths = []
stack = [(tree, [])]
while stack:
node, path = stack.pop()
if 'children' in node and node.get('children'):
for child in node['children']:
stack.append((child, path + [node['id']]))
else:
paths.append(path + [node['id']])
return paths
函数用法
node_d = {“id”: “D”, “children”: []}
node_c = {“id”: “C”, “children”: [node_d]}
node_b = {“id”: “B”, “children”: []}
node_a = {“id”: “A”, “children”: [node_b, node_c]}
tree_data = node_a
paths = gen_tree_paths(tree_data)
对比
if __name__ == '__main__':
n = 2000000
# 使用函数并打印结果
import time
t1 = time.time()
for i in range(n):
paths = gen_tree_paths(tree_data)
print('gen_tree_paths:', time.time() - t1)
print(paths)
# for path in paths:
# print(' -> '.join(path))
# t1 = time.time()
# for i in range(n):
# paths = get_tree_paths(tree_data)
# print('get_tree_paths:', time.time() - t1)
# print(paths)
经过上述测试数据测试,发现非递归的算法竟然更慢!
可能和节点数量有关,理论上树的层数越多递归算法耗时会更长。