📌  相关文章
📜  从给定的中序和前序遍历构造树(1)

📅  最后修改于: 2023-12-03 15:06:38.269000             🧑  作者: Mango

通过给定的中序和前序遍历构造树

在二叉树的遍历中,有三种常见的方式:前序遍历、中序遍历和后序遍历。对于给定了二叉树的前序和中序遍历,我们可以通过构造的方式重新构建出这个树的结构来。

算法思路

假设我们有二叉树的前序遍历序列 preorder 和中序遍历序列 inorder,目标是通过这两个序列构造出整棵树的结构,算法的执行步骤如下:

  1. 使用前序遍历的第一个节点作为根节点 root
  2. 在中序遍历序列 inorder 中找到节点 root 的索引值 rootIndex
  3. 将中序遍历序列 inorder 分为两个部分:左子树部分 inorderLeft 和右子树部分 inorderRight
  4. 将左子树部分的前序遍历 preorderLeft 和右子树部分的前序遍历 preorderRight 分别找出来;
  5. 针对左子树部分的前序和中序遍历序列,递归的构造左子树,针对右子树部分的序列,递归的构造右子树;
  6. 最后返回根节点 root
代码实现

下面是使用 Python 语言实现的代码,其中 preorderinorder 是两个输入参数,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)$。