Leetcode 105 Construct Binary Tree from Preorder and Inorder Traversal

题目大意

给出二叉树的前序与中序遍历,返回该二叉树

算法

很简单,递归的去做
前序第一个点为当前子树的根节点,在中序中寻找该节点,以此节点进行划分,左边为根节点左子树中序,右边为根节点的右子树中序。

前序的划分利用中序划分的结果,左子树前序等于list[1 … 1+len(左子树中序)]
,右子树中序等于list[1+len(左子树中序) … 最后]

代码

You are here!
Your runtime beats 95.32% of pythonsubmissions

class Solution(object):
    def addTree(self, preorder_start,preorder_end,inorder_start,inorder_end):
        if preorder_end <= preorder_start or inorder_end <= inorder_start:
            return None

        head_num = self.preorder[preorder_start]
        head = TreeNode(head_num)
        head_index = self.dict[head_num]

        length = head_index - inorder_start + 1

        head.left = self.addTree(preorder_start+1,preorder_start + length,inorder_start,head_index)
        head.right = self.addTree(preorder_start + length,preorder_end,head_index+1,inorder_end)

        return head


    def buildTree(self, preorder, inorder):
        """
        :type preorder: List[int]
        :type inorder: List[int]
        :rtype: TreeNode
        """
        if len(preorder) == 0:
            return None

        self.preorder = preorder
        self.inorder = inorder
        self.dict = {}

        i = 0
        for ele in inorder:
            self.dict[ele] = i
            i += 1
        length = len(preorder)
        return self.addTree(0,length,0,length)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值