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
相关推荐
DdddJMs__1357 小时前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
Sunyanhui18 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展
一个不喜欢and不会代码的码农8 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode
AnFany13 小时前
LeetCode【0051】N皇后
python·算法·leetcode·回溯法·n皇后
可别是个可爱鬼13 小时前
代码随想录 -- 动态规划 -- 完全平方数
数据结构·python·算法·leetcode·动态规划
一直学习永不止步13 小时前
LeetCode题练习与总结:至少有 K 个重复字符的最长子串--395
java·算法·leetcode·字符串·滑动窗口·哈希表·分治
DdddJMs__13515 小时前
C语言 | Leetcode C语言题解之第552题学生出勤记录II
c语言·leetcode·题解
DdddJMs__13515 小时前
C语言 | Leetcode C语言题解之第554题砖墙
c语言·leetcode·题解
我是聪明的懒大王懒洋洋16 小时前
力扣力扣力:53.最大子数组和
算法·leetcode·职场和发展
九圣残炎17 小时前
【从零开始的LeetCode-算法】3345. 最小可整除数位乘积 I
java·算法·leetcode