返回

从先序和中序遍历序列构造二叉树

前端







## 从先序和中序遍历序列构造二叉树

## 先序遍历和中序遍历

先序遍历是按照根-左子树-右子树的顺序访问二叉树中的每个节点。中序遍历是按照左子树-根-右子树的顺序访问二叉树中的每个节点。

例如,考虑以下二叉树:

1

/
2 3
/
4 5


先序遍历此树的结果为:12453。中序遍历此树的结果为:42513## 构造二叉树

现在,我们已经知道了先序遍历和中序遍历,我们可以根据它们来构造二叉树。

首先,我们要确定树根。树根是先序遍历的第一个元素。在本例中,树根是1。

接下来,我们要在中序遍历结果中找到树根。在中序遍历结果中,树根位于左子树和右子树的中间。在本例中,树根1位于42的中间。

现在,我们可以将中序遍历结果分成三个部分:左子树(4)、树根(1)和右子树(253)。

然后,我们可以递归地应用同样的方法来构造左子树和右子树。

对于左子树,先序遍历的第一个元素是4,中序遍历结果为4。因此,左子树的根是4。我们将中序遍历结果分成两部分:左子树(空)和右子树(5)。然后,我们可以递归地应用同样的方法来构造左子树和右子树。

对于右子树,先序遍历的第一个元素是2,中序遍历结果为253。因此,右子树的根是2。我们将中序遍历结果分成两部分:左子树(空)和右子树(53)。然后,我们可以递归地应用同样的方法来构造左子树和右子树。

这样,我们就构造出了整个二叉树。

```python
def construct_binary_tree(preorder, inorder):
  """
  根据先序和中序遍历序列构造二叉树。

  Args:
    preorder: 先序遍历序列。
    inorder: 中序遍历序列。

  Returns:
    二叉树的根节点。
  """

  # 如果先序遍历序列为空,则返回None。
  if not preorder:
    return None

  # 树根是先序遍历序列的第一个元素。
  root_value = preorder[0]

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

  # 左子树的中序遍历序列。
  left_inorder = inorder[:root_index]

  # 右子树的中序遍历序列。
  right_inorder = inorder[root_index + 1:]

  # 左子树的先序遍历序列。
  left_preorder = preorder[1:root_index + 1]

  # 右子树的先序遍历序列。
  right_preorder = preorder[root_index + 1:]

  # 递归地构造左子树和右子树。
  left_subtree = construct_binary_tree(left_preorder, left_inorder)
  right_subtree = construct_binary_tree(right_preorder, right_inorder)

  # 创建树根节点。
  root = TreeNode(root_value)

  # 将左子树和右子树连接到树根节点。
  root.left = left_subtree
  root.right = right_subtree

  # 返回树根节点。
  return root