📅  最后修改于: 2023-12-03 14:54:27.779000             🧑  作者: Mango
本文将介绍如何使用递归和回溯算法,打印一棵树所有根到叶子节点的路径,并展示路径在树中的相对位置。
我们可以使用深度优先搜索(DFS)算法,以递归的方式遍历每一个节点,记录下经过的路径,并且在遍历到叶子节点时将路径打印出来。
由于需要展示路径在树中的相对位置,因此我们需要记录路径中每个节点相对于父节点的位置。具体来说,我们可以使用数组 direction
记录每个节点相对于父节点的方向,其中 0
表示左子树,1
表示右子树。
当我们遍历到叶子节点时,将路径打印出来,并按照 direction
数组中的记录,在路径上标记出每个节点的位置。
以下是针对二叉树的实现代码片段,其中 append_to_path
函数用于将当前节点加入路径中, is_leaf
函数用于判断当前节点是否为叶子节点。
def print_paths(root):
if root is None:
return
path = [] # 记录当前路径
direction = [] # 记录每个节点的方向
print_paths_helper(root, path, direction)
def print_paths_helper(node, path, direction):
if node is None:
return
# 添加当前节点到路径中
append_to_path(path, node.val)
# 如果是叶子节点,打印路径
if is_leaf(node):
print_path(path, direction)
# 递归遍历左子树
direction.append(0)
print_paths_helper(node.left, path, direction)
direction.pop()
# 递归遍历右子树
direction.append(1)
print_paths_helper(node.right, path, direction)
direction.pop()
# 从路径中删除当前节点
path.pop()
def append_to_path(path, val):
# 将节点加入路径
path.append(val)
def is_leaf(node):
# 判断是否为叶子节点
return node.left is None and node.right is None
def print_path(path, direction):
# 打印路径
for i, val in enumerate(path):
if i > 0:
print("->", end=" ")
if i < len(direction):
if direction[i] == 0:
print("L:", end=" ")
else:
print("R:", end=" ")
print(val, end=" ")
print()
以下是针对一棵包含 1-9 的二叉树的测试示例,其中节点 1 为根节点,节点 9 和 6 为叶子节点。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
if __name__ == "__main__":
# 构建一棵二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.left = TreeNode(6)
root.right.right = TreeNode(7)
root.left.right.left = TreeNode(8)
root.right.left.right = TreeNode(9)
print_paths(root)
输出结果为:
1 -> L: 2 -> L: 4
1 -> L: 2 -> R: 5 -> L: 8
1 -> R: 3 -> L: 6 -> R: 9
1 -> R: 3 -> R: 7