返回

力扣105题:使用前序遍历和中序遍历还原二叉树(Python代码)

后端

前言

在计算机科学中,二叉树是一种常用的数据结构,它由一个根节点和若干个子节点组成。二叉树的每个节点最多可以有两个子节点,分别称为左子节点和右子节点。前序遍历和中序遍历是两种常见的二叉树遍历方式,它们分别以不同的顺序访问二叉树中的节点。

1. 前序遍历与中序遍历简介

前序遍历: 从根节点开始,依次访问根节点、左子节点、右子节点。

中序遍历: 从根节点开始,依次访问左子节点、根节点、右子节点。

2. 算法思路

通过前序遍历和中序遍历结果来重建二叉树,算法步骤如下:

  1. 前序遍历的第一个节点是根节点。
  2. 在中序遍历结果中,找到根节点。
  3. 使用中序遍历结果将根节点左侧的节点作为左子树,右侧的节点作为右子树。
  4. 对左子树和右子树重复步骤1-3,直到所有节点都已重建。

3. Python代码实现

class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

def build_tree(preorder, inorder):
    if not preorder or not inorder:
        return None

    # 前序遍历的第一个节点是根节点
    root_val = preorder[0]
    # 在中序遍历结果中找到根节点
    root_index = inorder.index(root_val)

    # 使用中序遍历结果将根节点左侧的节点作为左子树,右侧的节点作为右子树
    left_tree = build_tree(preorder[1:root_index+1], inorder[:root_index])
    right_tree = build_tree(preorder[root_index+1:], inorder[root_index+1:])

    # 创建根节点并连接左右子树
    root = Node(root_val)
    root.left = left_tree
    root.right = right_tree

    return root

# 测试用例
preorder = [3, 9, 20, 15, 7]
inorder = [9, 3, 15, 20, 7]
root = build_tree(preorder, inorder)

# 打印二叉树
def print_tree(root):
    if not root:
        return

    print(root.val)
    print_tree(root.left)
    print_tree(root.right)

print_tree(root)

4. 结语

本教程详细讲解了如何使用前序遍历和中序遍历结果重建二叉树的算法,并提供了详细的代码实现和注释,以帮助您快速掌握二叉树重建方法。您可以根据需要修改代码以适应不同的二叉树结构。