zoukankan      html  css  js  c++  java
  • LeetCode--105--从前序与中序遍历序列构造二叉树(python)

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

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

    例如,给出

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

    3
    /
    9 20
    /
    15 7

     1 class Solution:
     2     def buildTree(self, preorder, inorder):
     3         """
     4         :type preorder: List[int]
     5         :type inorder: List[int]
     6         :rtype: TreeNode
     7         """
     8         def helper(in_left = 0, in_right = len(inorder)):
     9             nonlocal pre_idx
    10             # if there is no elements to construct subtrees
    11             if in_left == in_right:
    12                 return None
    13             
    14             # pick up pre_idx element as a root
    15             root_val = preorder[pre_idx]
    16             root = TreeNode(root_val)
    17 
    18             # root splits inorder list
    19             # into left and right subtrees
    20             index = idx_map[root_val]
    21 
    22             # recursion 
    23             pre_idx += 1
    24             # build left subtree
    25             root.left = helper(in_left, index)
    26             # build right subtree
    27             root.right = helper(index + 1, in_right)
    28             return root
    29         
    30         # start from first preorder element
    31         pre_idx = 0
    32         # build a hashmap value -> its index
    33         idx_map = {val:idx for idx, val in enumerate(inorder)} 
    34         return helper()

     2019-9-20

     1 class Solution:
     2     def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
     3         if len(preorder)==0:
     4             return None
     5         if len(preorder)==1:
     6             return TreeNode(preorder[0])
     7         root = TreeNode(preorder[0])
     8         inorderL = inorder[:inorder.index(preorder[0])]
     9         inorderR = inorder[inorder.index(preorder[0])+1:]
    10         root.left = self.buildTree(preorder[1:inorder.index(preorder[0])+1],inorderL)
    11         root.right = self.buildTree(preorder[inorder.index(preorder[0])+1:],inorderR)
    12         return root

    2019-11-20 14:49:13

  • 相关阅读:
    ViewPagerAdapter
    Android Touch事件传递机制详解
    android ANR产生原因和解决办法【转】
    Android 操作系统的内存回收机制(转载)
    android的程序运行数据存放在哪里?
    自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果
    Android中 Bitmap和Drawable相互转换的方法
    android 存储图片到data目录和读取data目录下的图片
    多线程调用HttpWebRequest并发连接限制
    反射
  • 原文地址:https://www.cnblogs.com/NPC-assange/p/11511853.html
Copyright © 2011-2022 走看看