返回

二叉树构建:从前序与中序遍历序列中构建二叉树

闲谈

### **一、前序遍历与中序遍历简介** 

- 前序遍历(pre-order traversal):
  - 根结点 -> 左子树 -> 右子树
  - 优点:简单高效,易于理解和实现
  - 缺点:不方便从序列中唯一确定一棵树


- 中序遍历(in-order traversal):
  - 左子树 -> 根结点 -> 右子树
  - 优点:易于生成一棵二叉搜索树(BST)
  - 缺点:查找特定结点效率不高


### **二、从前序与中序遍历序列构造二叉树** 

- **思路:** 
  - 确定根结点:前序遍历序列的第一个结点即是根结点。
  - 确定左子树与右子树:利用中序遍历序列将结点分为左右两部分,左部分是左子树,右部分是右子树。
  - 递归处理:对左右子树重复上述步骤。


- **算法:** 

  - 确定根结点:前序遍历序列的第一个结点即是根结点。
  - 确定左子树与右子树:利用中序遍历序列将结点分为左右两部分,左部分是左子树,右部分是右子树。
  - 递归处理:对左右子树重复上述步骤。


- **复杂度分析:** 

  - 时间复杂度:O(n^2),其中n为序列的长度。这是因为在最坏情况下,我们需要对每个结点进行n次比较。
  - 空间复杂度:O(n),其中n为序列的长度。这是因为我们在递归过程中需要使用栈来存储结点。


### **三、代码实现:** 

```python
def build_tree(preorder, inorder):
    """
    从前序与中序遍历序列构造二叉树。

    参数:
        preorder:前序遍历序列
        inorder:中序遍历序列

    返回:
        根结点
    """

    if not preorder or not inorder:
        return None

    # 确定根结点
    root = TreeNode(preorder[0])

    # 确定左子树与右子树
    index = inorder.index(root.val)
    left_inorder = inorder[:index]
    right_inorder = inorder[index + 1:]
    left_preorder = preorder[1:index + 1]
    right_preorder = preorder[index + 1:]

    # 递归处理
    root.left = build_tree(left_preorder, left_inorder)
    root.right = build_tree(right_preorder, right_inorder)

    return root


# 测试代码
preorder = [3, 9, 20, 15, 7]
inorder = [9, 3, 15, 20, 7]
root = build_tree(preorder, inorder)
print(root)
```

### **四、总结** 

本文介绍了如何从前序与中序遍历序列构造二叉树。我们给出了一个清晰且简单的递归算法,帮助你轻松理解这一过程。无论你是初学者还是经验丰富的程序员,都能从本文中有所收获。