📅  最后修改于: 2023-12-03 15:06:38.269000             🧑  作者: Mango
在二叉树的遍历中,有三种常见的方式:前序遍历、中序遍历和后序遍历。对于给定了二叉树的前序和中序遍历,我们可以通过构造的方式重新构建出这个树的结构来。
假设我们有二叉树的前序遍历序列 preorder
和中序遍历序列 inorder
,目标是通过这两个序列构造出整棵树的结构,算法的执行步骤如下:
root
;inorder
中找到节点 root
的索引值 rootIndex
;inorder
分为两个部分:左子树部分 inorderLeft
和右子树部分 inorderRight
;preorderLeft
和右子树部分的前序遍历 preorderRight
分别找出来;root
。下面是使用 Python 语言实现的代码,其中 preorder
和 inorder
是两个输入参数,buildTree(preorder, inorder)
返回重建后的树的根节点。具体实现如下:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def buildTree(preorder: List[int], inorder: List[int]) -> TreeNode:
if not preorder or not inorder:
return None
root = TreeNode(preorder[0])
rootIndex = inorder.index(root.val)
leftInorder = inorder[:rootIndex]
rightInorder = inorder[rootIndex+1:]
leftPreorder = preorder[1:rootIndex+1]
rightPreorder = preorder[rootIndex+1:]
root.left = buildTree(leftPreorder, leftInorder)
root.right = buildTree(rightPreorder, rightInorder)
return root
通过给定的中序和前序遍历,我们可以递归的将整棵树构建出来。决定了递归法的时间复杂度,所以这个算法的时间复杂度是 $O(n)$,其中 $n$ 是节点的数量。同时,在递归执行过程中,会使用额外的栈空间,因此该算法的空间复杂度也是 $O(n)$。