leetcode分类刷题:二叉树(六、构造二叉树)

构造二叉树的题目递归模板较为统一直观

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

重复逻辑:不断构造根节点、划分左右子树和构建左右子树,非常直观的写法

python 复制代码
'''
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]
思路:递归重复逻辑:不断构造根节点、划分左右子树和构建左右子树,非常直观的写法
'''
class Solution:
    def buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
        # 简单情况
        if len(inorder) == 0 and len(postorder) == 0:
            return None
        else:  # 重复逻辑:不断构造根节点、划分左右子树和构建左右子树
            rootVal = postorder[-1]  # postorder: 左右根; 从postorder寻找根节点
            root = TreeNode(rootVal)
            idx = inorder.index(rootVal)  # inorder:左根右; 从inorder寻找划分index
            # 将inorder划分为左右子树
            inorderLeft = inorder[:idx]
            inorderRight = inorder[idx + 1:]
            # 将postorder划分为左右子树
            postorderLeft = postorder[:len(inorderLeft)]
            postorderRight = postorder[len(inorderLeft): -1]
            # 构建左右子树
            root.left = self.buildTree(inorderLeft, postorderLeft)
            root.right = self.buildTree(inorderRight, postorderRight)
            return root

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

重复逻辑:不断构造根节点、划分左右子树和构建左右子树,非常直观的写法

python 复制代码
'''
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]
思路:递归重复逻辑:不断构造根节点、划分左右子树和构建左右子树,非常直观的写法
'''
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
        # 简单情况
        if len(preorder) == 0 and len(preorder) == 0:
            return None
        else:  # 重复逻辑:不断构造根节点、划分左右子树和构建左右子树
            rootVal = preorder[0]  # preorder: 根左右; 从preorder寻找根节点
            root = TreeNode(rootVal)
            idx = inorder.index(rootVal)  # inorder:左根右; 从inorder寻找划分index
            # 将inorder划分为左右子树
            inorderLeft = inorder[:idx]
            inorderRight = inorder[idx + 1:]
            # 将preorder划分为左右子树
            preorderLeft = preorder[1: len(inorderLeft) + 1]
            preorderRight = preorder[len(inorderLeft) + 1:]
            # 构建左右子树
            root.left = self.buildTree(preorderLeft, inorderLeft)
            root.right = self.buildTree(preorderRight, inorderRight)
            return root

654. 最大二叉树

重复逻辑:创建一个根节点,其值为nums 中的最大值;递归地在最大值左边的子数组前缀上构建左子树;递归地在最大值 右边 的子数组后缀上构建右子树

python 复制代码
'''
654. 最大二叉树
给定两个整数数组preorder 和 inorder,其中preorder 是二叉树的先序遍历, inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。
给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums 递归地构建:
创建一个根节点,其值为nums 中的最大值。
递归地在最大值左边的子数组前缀上构建左子树。
递归地在最大值 右边 的子数组后缀上构建右子树。
返回nums 构建的 最大二叉树 。
示例 1:
    输入:nums = [3,2,1,6,0,5]
    输出:[6,3,5,null,2,0,null,null,1]
'''
class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
        # 简单情况
        if len(nums) == 0:
            return None
        else:  # 重复逻辑
            maxVal = max(nums)
            idx = nums.index(maxVal)
            root = TreeNode(maxVal)
            root.left = self.constructMaximumBinaryTree(nums[:idx])
            root.right = self.constructMaximumBinaryTree(nums[idx+1:])
            return root

108. 将有序数组转换为二叉搜索树

重复逻辑:不断划分数组、构造根节点、划分左右子树和构建左右子树

python 复制代码
'''
108. 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例 1:
    输入:nums = [-10,-3,0,5,9]
    输出:[0,-3,9,-10,null,5]
    解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
思路:重复逻辑:不断划分数组、构造根节点、划分左右子树和构建左右子树
'''
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        # 高度平衡,意味着要不断二分
        # 简单情况
        if len(nums) == 0:
            return None
        else:  # 重复逻辑:划分数组、创建根节点、构建左右子树
            idx = (0 + len(nums) - 1) // 2  # 获取数组0~len(nums)-1的中间索引
            root = TreeNode(nums[idx])
            leftNums, rightNums = nums[:idx], nums[idx + 1:]
            root.left = self.sortedArrayToBST(leftNums)
            root.right = self.sortedArrayToBST(rightNums)
            return root
相关推荐
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
元亓亓亓3 天前
LeetCode热题100--105. 从前序与中序遍历序列构造二叉树--中等
算法·leetcode·职场和发展
仙俊红3 天前
LeetCode每日一题,20250914
算法·leetcode·职场和发展
_不会dp不改名_3 天前
leetcode_21 合并两个有序链表
算法·leetcode·链表
吃着火锅x唱着歌3 天前
LeetCode 3302.字典序最小的合法序列
leetcode
睡不醒的kun3 天前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
吃着火锅x唱着歌3 天前
LeetCode 978.最长湍流子数组
数据结构·算法·leetcode
爱编程的化学家3 天前
代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
数据结构·c++·算法·leetcode·二叉树·代码随想录
吃着火锅x唱着歌3 天前
LeetCode 1446.连续字符
算法·leetcode·职场和发展
愚润求学3 天前
【贪心算法】day10
c++·算法·leetcode·贪心算法