返回
从先序和中序遍历序列构造二叉树
前端
2023-09-12 09:07:31
## 从先序和中序遍历序列构造二叉树
## 先序遍历和中序遍历
先序遍历是按照根-左子树-右子树的顺序访问二叉树中的每个节点。中序遍历是按照左子树-根-右子树的顺序访问二叉树中的每个节点。
例如,考虑以下二叉树:
1
/
2 3
/
4 5
先序遍历此树的结果为:1、2、4、5、3。中序遍历此树的结果为:4、2、5、1、3。
## 构造二叉树
现在,我们已经知道了先序遍历和中序遍历,我们可以根据它们来构造二叉树。
首先,我们要确定树根。树根是先序遍历的第一个元素。在本例中,树根是1。
接下来,我们要在中序遍历结果中找到树根。在中序遍历结果中,树根位于左子树和右子树的中间。在本例中,树根1位于4和2的中间。
现在,我们可以将中序遍历结果分成三个部分:左子树(4)、树根(1)和右子树(2、5、3)。
然后,我们可以递归地应用同样的方法来构造左子树和右子树。
对于左子树,先序遍历的第一个元素是4,中序遍历结果为4。因此,左子树的根是4。我们将中序遍历结果分成两部分:左子树(空)和右子树(5)。然后,我们可以递归地应用同样的方法来构造左子树和右子树。
对于右子树,先序遍历的第一个元素是2,中序遍历结果为2、5、3。因此,右子树的根是2。我们将中序遍历结果分成两部分:左子树(空)和右子树(5、3)。然后,我们可以递归地应用同样的方法来构造左子树和右子树。
这样,我们就构造出了整个二叉树。
```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