📌  相关文章
📜  打印具有相对位置的所有根到叶路径(1)

📅  最后修改于: 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