• 树-构建二叉树


    link:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof
    
    输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
    例如,给出
    
    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]
    返回如下的二叉树:
    
        3
       / 
      9  20
        /           
       15   7
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
            if not preorder: return None            
            r = TreeNode(preorder[0])               
            rid = inorder.index(preorder[0])        
            r.left = self.buildTree(preorder[1:1+rid], inorder[:rid])     
            r.right = self.buildTree(preorder[rid+1:], inorder[rid+1:])   
            return r

    题目二:前中式构建二叉树

    105. 从前序与中序遍历序列构造二叉树
    根据一棵树的前序遍历与中序遍历构造二叉树。
    
    注意:
    你可以假设树中没有重复的元素。
    
    例如,给出
    
    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]
    返回如下的二叉树:
    
        3
       / 
      9  20
        /  
       15   7
    
    
    
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
            if not preorder or not inorder:  # 递归终止条件
                return
            root = TreeNode(preorder[0])  
            # 先序为“根左右”,所以根据preorder可以确定root
            idx = inorder.index(preorder[0])  
            # 中序为“左根右”,根据root可以划分出左右子树
            # 下面递归对root的左右子树求解即可
            root.left = self.buildTree(preorder[1:1 + idx], inorder[:idx])
            root.right = self.buildTree(preorder[1 + idx:], inorder[idx + 1:])
            return root
    
    
    class Solution:
        def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
            if not preorder:
                return None
    
            root = TreeNode(preorder[0])
            stack = [root]
            inorderIndex = 0
            for i in range(1, len(preorder)):
                preorderVal = preorder[i]
                node = stack[-1]
                if node.val != inorder[inorderIndex]:
                    node.left = TreeNode(preorderVal)
                    stack.append(node.left)
                else:
                    while stack and stack[-1].val == inorder[inorderIndex]:
                        node = stack.pop()
                        inorderIndex += 1
                    node.right = TreeNode(preorderVal)
                    stack.append(node.right)
    
            return root

    题目三:中后序构建二叉树

    106. 从中序与后序遍历序列构造二叉树
    根据一棵树的中序遍历与后序遍历构造二叉树。
    
    注意:
    你可以假设树中没有重复的元素。
    
    例如,给出
    
    中序遍历 inorder = [9,3,15,20,7]
    后序遍历 postorder = [9,15,7,20,3]
    返回如下的二叉树:
    
        3
       / 
      9  20
        /  
       15   7
    
    
    
     class Solution(object):
        def buildTree(self, inorder, postorder):
            if not (inorder and postorder):
                return None
            def helper(inor,post):
                if not post:
                    return None
                # 根据后序数组的最后一个元素,创建根节点    
                root = TreeNode(post[-1])
                # 在中序数组中查找值等于【后序数组最后一个元素】的下标
                idx = inor.index(post[-1])
                # 确定这个下标i后,将中序数组分成两部分,后序数组分成两部
                # 递归处理中序数组左边,后序数组左边
                # 递归处理中序数组右边,后序数组右边
                root.left = helper(inor[:idx],post[:idx])
                root.right = helper(inor[idx+1:],post[idx:-1])
                return root
            return helper(inorder,postorder)
    好好学习,天天向上
  • 相关阅读:
    go websocket
    go websocket 调试报错 request origin not allowed by Upgrader
    uniapp中使用阿里巴巴图标iconfont
    TS视频一
    ReactiveCocoa
    weak 的内部实现原理
    谈Objective-C block的实现
    基础面试总结
    理解 iOS 的内存管理
    URL Scheme
  • 原文地址:https://www.cnblogs.com/topass123/p/13369329.html
Copyright © 2020-2023  润新知