美文网首页
二叉树 13 (最大二叉树 leetcode 654)

二叉树 13 (最大二叉树 leetcode 654)

作者: Sisyphus235 | 来源:发表于2023-02-20 21:58 被阅读0次

    思想

    二叉树的核心思想是分治和递归,特点是遍历方式。
    解题方式常见两类思路:

    1. 遍历一遍二叉树寻找答案;
    2. 通过分治分解问题寻求答案;

    遍历分为前中后序,本质上是遍历二叉树过程中处理每个节点的三个特殊时间点:

    1. 前序是在刚刚进入二叉树节点时执行;
    2. 后序是在将要离开二叉树节点时执行;
    3. 中序是左子树遍历完进入右子树前执行;
    # 前序
         1 node
        /      \
     2 left   3 right
    中左右
     
    # 中序
         2 node
        /      \
     1 left    3 right
    左中右
     
    # 后序
         3 node
        /      \
     1 left    2 right     
    左右中       
    

    多叉树只有前后序列遍历,因为只有二叉树有唯一一次中间节点的遍历

    题目的关键就是找到遍历过程中的位置,插入对应代码逻辑实现场景的目的。

    实例

    最大二叉树 leetcode 654

    class TreeNode:
        def __init__(self, val=0, left=None, right=None):
            self.val = val
            self.left = left
            self.right = right
    

    输入:
    nums: List[int],一个不重复的整数数组

    输出:
    TreeNode,根据 nums 构建一颗二叉树,返回根节点。每个节点是当前 nums 中的最大值,且左子树是这个值左侧的元素,右子树是右侧的元素。

    举例:
    给定 [3,2,1,6,0,5]
    最大值是 6,作为根节点,左子树是 [3,2,1],右子树是 [0,5]
    左子树中最大值是 3,作为左子树的节点,他的左子树是 [],右子树是 [2,1]
    右子树中最大值是 5,作为右子树的节点,他的左子树是 [0],右子树是 []
    ...

        6                 
       / \               
     3    5         
      \   /           
       2 0   
        \
         1      
    

    二叉树的数据存储可以使用链表,也可以使用数组,往往数组更容易表达,根节点从 index=1 处开始存储,浪费 index=0 的位置
    left_child = 2 * parent
    right_child = 2 * parent + 1
    parent = child // 2

    分治解

    基本情境是找到当前构建二叉树的元素范围,在这个范围中找到值最大的元素和下标。
    这个元素构建一个二叉树的根节点,下标左侧是递归构建二叉树的新范围,右侧同理,左右子树指针连接好后返回当前根节点。

    上例中

    • 初始范围是 0, 5,元素是 [3,2,1,6,0,5],其中的最大值是 6,下标是 3。构建一个根节点 TreeNode(6),6.left = [3,2,1],6.right = [0, 5]
    • 左子树 [3,2,1] 的范围是 0,2,,其中的最大值是 3,下标是 0。构建一个根节点 TreeNode(3),3.left = [],3.right = [2,1]
    • ...

    编码

    
    from typing import Optional, List
    
    
    class TreeNode:
        def __init__(self, val=0, left=None, right=None):
            self.val = val
            self.left = left
            self.right = right
    
    
    def maximum_binary_tree(nums: List[int]) -> Optional[TreeNode]:
        def construct(left: int, right: int) -> Optional[TreeNode]:
            # base 条件,返回树的叶子的左右子树的空指针节点
            if left > right:
                return None
            # 找到范围中的最大值和下标
            max_int, max_index = None, None
            for i in range(left, right + 1):
                # 初始情况和当前值比最大值大时,更新信息
                if max_int is None or nums[i] > max_int:
                    max_int, max_index = nums[i], i
            # 构建二叉树
            root = TreeNode(max_int)
            root.left = construct(left, max_index - 1)
            root.right = construct(max_index + 1, right)
            return root
        # 边界保护
        if len(nums) == 0:
            return None
        return construct(0, len(nums) - 1)
    
    

    相关

    二叉树 0
    二叉树 1
    二叉树 2
    二叉树 3
    二叉树 4
    二叉树 5
    二叉树 6
    二叉树 7
    二叉树 8
    二叉树 9
    二叉树 10
    二叉树 11
    二叉树 12

    相关文章

      网友评论

          本文标题:二叉树 13 (最大二叉树 leetcode 654)

          本文链接:https://www.haomeiwen.com/subject/oeagkdtx.html