• 二叉树 | 构造二叉树 | 中序&后序、前序&中序遍历序列、最大二叉树 | leecode刷题笔记


    跟随carl代码随想录刷题
    语言:python


    只由前序后序不能唯一构成二叉树!因为没有中序遍历就无法确定左右不分,也就无法分割!
    从下面106105题目中可以看出,两个代码的书写思路都是:

    1. 先从前序后序中取出根节点,
    2. 然后找到根节点在中序中的索引,根据索引位置进行分割,将中序分割成左右数组
    3. 然后根据数组长度相等原则,对前序后序进行分割
    4. 进行递归

    注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。——代码随想录

    106. 从中序与后序遍历序列构造二叉树

    题目:给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

    👉示例1:
    在这里插入图片描述
    输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
    输出:[3,9,20,null,null,15,7]
    👉示例 2:
    输入:inorder = [-1], postorder = [-1]
    输出:[-1]

    题目分析

    1. 后序数组的最后一个元素为切割点
    2. 先切中序数组
    3. 再反过来切后序数组
    4. 一层一层切下去,每次后序数组最后一个元素就是节点元素。

    原则:切割的时候,前序中序的左右数组长度相同。
    请添加图片描述

    完整代码如下

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
            # 如果树为空,就返回None
            if not postorder: 
                return None
            
            # 后序遍历的最后一个节点就是中间节点
            root_val = postorder[-1]
            root = TreeNode(root_val)
          
            # 找切割点
            separator_idx = inorder.index(root_val)
    
            # 切割inorder数组
            inorder_left = inorder[:separator_idx]
            inorder_right = inorder[separator_idx+1:]  # 不包含切割点
    
            # 切割postorder数组
            postorder_left = postorder[:len(inorder_left)]
            postorder_right = postorder[len(inorder_left):len(postorder)-1]  # 注意这里是len(inorder_left)不是len(inorder_right)
            																# 结尾索引也可以直接写成`-1`
    
            # 递归
            root.left = self.buildTree(inorder_left, postorder_left)  # 注意函数调用有self
            root.right = self.buildTree(inorder_right, postorder_right)
    
            return root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    105. 从前序与中序遍历序列构造二叉树

    题目:给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
    👉示例1:
    在这里插入图片描述
    输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
    输出: [3,9,20,null,null,15,7]
    👉示例 2:
    输入: preorder = [-1], inorder = [-1]
    输出: [-1]

    题目分析

    原则:切割的时候,前序中序的左右数组长度相同。
    前序数组的第一个元素是根节点。
    请添加图片描述

    完整代码如下

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
            # 1. 如果树为空,就返回None
            if not preorder:
                return None  
    
            # 2. 前序遍历的第一个节点就是中间节点
            root_val = preorder[0]
            root = TreeNode(root_val)
    
            # 3. 找切割点
            separator_idx = inorder.index(root_val)
            
            # 4. 切割inorder数组,得到inorder数组的左右半边
            inorder_left = inorder[:separator_idx]
            inorder_right = inorder[separator_idx+1:]
    
            # 5. 切割preorder数组,得到preorder数组的左右半边
            # 重点:中序数组与前序数组的大小一定是相同的。
            preorder_left = preorder[1:1+len(inorder_left)]
            preorder_right = preorder[1+len(inorder_left):]
    
            # 6. 递归
            root.left = self.buildTree(preorder_left, inorder_left)
            root.right = self.buildTree(preorder_right, inorder_right)
    
            return root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    654. 最大二叉树

    题目:给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
    创建一个根节点,其值为 nums 中的最大值。
    递归地在最大值 左边 的 子数组前缀上 构建左子树。
    递归地在最大值 右边 的 子数组后缀上 构建右子树。
    返回 nums 构建的 最大二叉树 。
    在这里插入图片描述
    输入:nums = [3,2,1,6,0,5]
    输出:[6,3,5,null,2,0,null,null,1]

    题目分析

    与构造二叉树是一个思路

    完整代码如下

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
            if not nums:
                return None
            maxvalue = max(nums)
            index = nums.index(maxvalue)
    
            root = TreeNode(maxvalue)
    
            left = nums[:index]
            right = nums[index+1:]
    
            root.left = self.constructMaximumBinaryTree(left)
            root.right = self.constructMaximumBinaryTree(right)
            return root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    【java学习】面向对象特征之一:封装和隐藏(23)
    qrcode.min.js下载
    qlib高阶应用之财务数据库与自定义表达式
    lv7 嵌入式开发-网络编程开发 12 IP协议与ethernet协议
    SpringMVC环境搭建——配置文件版,配置文件+部分注解版
    升讯威在线客服系统的并发高性能数据处理技术:具体化视图
    【vue+蓝牙扫码枪】实现扫码录入发票信息,光标自动聚焦,列表中连续录入
    新华三H3CNE网络工程师认证—路由基础
    PT_大数定律LLN
    【centos7安装ElasticSearch】
  • 原文地址:https://blog.csdn.net/qq_44250700/article/details/126288968