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

目录

一、题目

二、示例

三、思路、

四、代码


一、题目

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:你可以假设树中没有重复的元素。

二、示例

示例:

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

     3
    /  \
  9   20
      /   \
    15   7

三、思路

先序遍历:根-->左-->右

中序遍历:左-->根-->右

先序遍历+中序遍历 可确定一个独一无二的二叉树

可以根据先序遍历序列中查找根结点,再从中序遍历序列中查找根节点所在的位置,根节点左边部分为左子树,右边部分为右子树。依次类推,依次确定每个结点所在的位置,即可构造出一棵二叉树。

例如,

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

preorder[0] = 3   3为根结点

因此在inorder数组中,3出现的位置[9,3,15,20,7],我们用变量n来记录该位置,n = 1

那么我们的树为

         3
       /   \
     9   15 20 7

首先我们先构造左子树,再构造右子树

因此左子树递归传入的数组为preorder[1:n+1]inorder[:n]

右子树递归传入的数组为preorder[n+1:]inorder[n+1:]

四、代码

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

    def __repr__(self):
        return str(self.val)

class Solution:
    def buildTree(self, preorder, inorder):
        """
            :type inorder: List[int]
            :type postorder: List[int]
            :rtype: TreeNode
        """
        if len(preorder) == 0:
            return
        root = TreeNode(preorder[0])
        n = inorder.index(root.val)
        root.left = self.buildTree(preorder[1:n+1], inorder[: n])
        root.right = self.buildTree(preorder[n+1:], inorder[n+1:])
        return root

if __name__ == '__main__':
    preorder = [3, 9, 20, 15, 7]
    inorder = [9, 3, 15, 20, 7]
    s = Solution()
    root = s.buildTree(preorder, inorder)
    print(root)

猜你喜欢

转载自blog.csdn.net/weixin_45666660/article/details/108794152