返回

如何根据前序中序还原二叉树

前端

二叉树基础

二叉树是一种树形数据结构,它由一个根节点和一组子节点组成。每个子节点都连接到它的父节点,并且可以有自己的子节点。二叉树通常用于存储和组织数据,例如文件系统、数据库和计算机网络。

二叉树有三种基本遍历方法:前序遍历、中序遍历和后序遍历。

  • 前序遍历 :从根节点开始,依次访问每个节点及其子节点。
  • 中序遍历 :从最左边的叶子节点开始,依次访问每个节点及其子节点。
  • 后序遍历 :从最右边的叶子节点开始,依次访问每个节点及其子节点。

如何根据前序中序还原二叉树

给定一个二叉树的前序遍历和中序遍历,我们可以根据这两个遍历还原出二叉树的结构。

还原步骤如下:

  1. 从前序遍历中找到根节点。根节点是第一个元素。
  2. 在中序遍历中找到根节点。根节点将中序遍历分为两部分,左边是左子树,右边是右子树。
  3. 将前序遍历中根节点后面的元素分为两部分,左边是左子树的前序遍历,右边是右子树的前序遍历。
  4. 根据左子树的前序遍历和中序遍历,递归地还原左子树。
  5. 根据右子树的前序遍历和中序遍历,递归地还原右子树。
  6. 将根节点、左子树和右子树组合成一棵二叉树。

示例

假设我们有一个二叉树,前序遍历为1, 2, 4, 5, 3, 6, 7,中序遍历为4, 2, 5, 1, 6, 3, 7

根据前序中序还原二叉树的步骤,我们可以得到以下结果:

  1. 从前序遍历中找到根节点。根节点是第一个元素,即1
  2. 在中序遍历中找到根节点。根节点将中序遍历分为两部分,左边是4, 2, 5,右边是6, 3, 7
  3. 将前序遍历中根节点后面的元素分为两部分,左边是2, 4, 5,右边是3, 6, 7
  4. 根据左子树的前序遍历2, 4, 5和中序遍历4, 2, 5,递归地还原左子树。得到左子树2, 4, 5
  5. 根据右子树的前序遍历3, 6, 7和中序遍历6, 3, 7,递归地还原右子树。得到右子树3, 6, 7
  6. 将根节点1、左子树2, 4, 5和右子树3, 6, 7组合成一棵二叉树。得到二叉树1, 2, 4, 5, 3, 6, 7

代码实现

def restore_binary_tree(preorder, inorder):
  """
  根据前序遍历和中序遍历还原二叉树。

  参数:
    preorder: 二叉树的前序遍历。
    inorder: 二叉树的中序遍历。

  返回:
    二叉树的根节点。
  """

  if not preorder or not inorder:
    return None

  # 从前序遍历中找到根节点。
  root_value = preorder[0]

  # 在中序遍历中找到根节点。
  root_index = inorder.index(root_value)

  # 将前序遍历中根节点后面的元素分为两部分,左边是左子树的前序遍历,右边是右子树的前序遍历。
  left_preorder = preorder[1:root_index + 1]
  right_preorder = preorder[root_index + 1:]

  # 将中序遍历中根节点前面的元素作为左子树的中序遍历,将中序遍历中根节点后面的元素作为右子树的中序遍历。
  left_inorder = inorder[:root_index]
  right_inorder = inorder[root_index + 1:]

  # 递归地还原左子树和右子树。
  left_subtree = restore_binary_tree(left_preorder, left_inorder)
  right_subtree = restore_binary_tree(right_preorder, right_inorder)

  # 将根节点、左子树和右子树组合成一棵二叉树。
  root = TreeNode(root_value)
  root.left = left_subtree
  root.right = right_subtree

  return root

总结

本文介绍了如何根据前序中序还原二叉树的方法。这种方法可以用于解决面试题,也可以用于编写二叉树的还原算法。希望本文对您有所帮助。