首页 > 编程语言 >代码随想录算法训练营day17| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

代码随想录算法训练营day17| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

时间:2024-10-16 20:33:36浏览次数:8  
标签:right val root1 self 二叉 搜索 二叉树 root left

学习资料:https://programmercarl.com/0654.最大二叉树.html#算法公开课

用前序遍历构造二叉树
二叉搜索树的特点,其左节点的值<每个节点的值<其右节点的值,且根节点的值大于它的左子树的所有节点的值,小于它右子树的所有节点的值,其他同理。
二叉搜索树的搜索和验证时不关心遍历顺序,因为值的大小关系已确定。

学习记录:
654.最大二叉树(前序;返回值:root;从数组中选出最大值作为root.val,切分数组获得左/右子树,然后递归;构造初始二叉树root=TreeNode(0))

点击查看代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def constructMaximumBinaryTree(self, nums):
        """
        :type nums: List[int]
        :rtype: TreeNode
        """
        if len(nums) == 1:
            return TreeNode(nums[0])
        
        # 如果不止一个节点,设置二叉树初始值为0,一般无左右子树
        node = TreeNode(0)

        max_val = 0
        max_idx = 0
        for i in range(len(nums)):
            if nums[i] > max_val:
                max_val = nums[i]
                max_idx = i
        node.val = max_val

        # 构建左子树
        if max_idx > 0: # 排除没有左子树的情况
            left_ls = nums[:max_idx]
            node.left = self.constructMaximumBinaryTree(left_ls)   # 递归
        # 构建右子树
        if max_idx < len(nums)-1:
            right_ls = nums[max_idx+1:]
            node.right = self.constructMaximumBinaryTree(right_ls)
        
        return node
        

617.合并二叉树(前序递归;若任意一个二叉树为none则和为另一个二叉树;直接在root1的基础上修改,在root.left开始递归,再对root.right递归;返回值:root1)

点击查看代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def mergeTrees(self, root1, root2):
        """
        :type root1: TreeNode
        :type root2: TreeNode
        :rtype: TreeNode
        """
        # 终止条件:如果root1没有根节点就说明root1对应的二叉树为None,那相加就是root2对应的二叉树咯
        if not root1:
            return root2
        if not root2:
            return root1
        
        # 根:本题选择就在root1基础上进行修改,选择前序:根左右
        root1.val += root2.val

        # 递归法:我认为就是左子节点的处理方式与根节点一样,还是用mergeTrees,对应参数变成了root1.left和root2.left
        root1.left = self.mergeTrees(root1.left, root2.left)
        # 右子树同理
        root1.right = self.mergeTrees(root1.right, root2.right)
        # 返回值:修改后的root1
        return root1
        

700.二叉搜索树中的搜索(思路:1当root为None或者root.val==target时都返回root;2因为二叉搜索树具备左<根<右的规律,通过root_val和target大小就看判断下一步遍历左子树还是右子树,递归)

点击查看代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def searchBST(self, root, val):
        """
        :type root: TreeNode
        :type val: int
        :rtype: TreeNode
        """
        # 如果root不存在或者根节点的值正好为目标值,则都是返回根节点,终止
        if root == None or root.val == val:
            return root
        # 二叉搜索树的特性:左<根<右
        # so, 当目标值小于根,就向左边遍历,这是一定的。
        if val < root.val:
            result = self.searchBST(root.left, val)
        # 右边同理
        if val > root.val:
            result = self.searchBST(root.right, val)
        return result

        

98.验证二叉搜索树(中序遍历+递归+双指针;pre-->root;左:递归;根:从第一个节点开始,往后遍历如果pre_val<root_val一直保持则返回True;右:递归;根据左右递归返回值共同决定返回True or False)

点击查看代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def __init__(self):
        self.pre = None # 设置最小值初值

    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        # 双指针法,pre-->root这种顺序,每次向后移动,如果一直保持pre.val<root.val则满足二叉搜索树的特性
        # 要用中序遍历来判断二叉搜索树,则示例2中递归的顺序是:1-->5-->3-->4-->5,一看就发现第二个大于第三个,返回False
        if not root:
            return True
        # 递归+中序
        # 左
        left = self.isValidBST(root.left)
        # 根
        if self.pre != None and self.pre.val >= root.val:
            return False
        self.pre = root  # 向后移动指针
        # 右
        right = self.isValidBST(root.right)
        return left and right

        

PS:今天的题解都比较短,舒服,就是赶紧一下就要忘记
今天吃的比较规律早中晚按时吃,晚饭突然下雨一整个雨中狂奔
好多测评要做,题也不是很难就是时间短永远做不完,狂投简历中,
实在不行咱也能gap一年,没太大事儿

标签:right,val,root1,self,二叉,搜索,二叉树,root,left
From: https://www.cnblogs.com/tristan241001/p/18470834

相关文章

  • 千千静听歌词搜索:第三方歌词服务器使用方法
    因为千千静听官方服务器已经停用,因此只能使用第三方歌词服务器资源都来自于网络,本人只是搬运工,两个个方法。方法一:修改配置文件ttp_lrcsh.ini配置文件如下,txt另存为ttp_lrcsh.ini,要把ttp_lrcsh.ini文件属性只读模式,软件后台会自动删除此文件。下载歌词配置并放入AddIn文件夹即可使......
  • 算法-二叉树展开单链表
    这道题我们可以利用栈来做,利用栈先进后出的特性每次先加入右节点再加入左节点,这样的话弹出的时候正好左节点在前面,右节点在后面满足题目要求。然后至于是构造单链表,我们可以用一个prev节点prev的left永远都是null而prev的right永远都等于cur 因为每次curr都是栈内弹出来......
  • C语言手撕实战代码_线索二叉树_先序中序线索二叉树_树的先根遍历_后根遍历_树的度_孩
    文章目录1.设计算法构造一棵先序线索二叉树2.先序线索二叉树的先序遍历算法3.设计算法构造一棵中序线索二叉树4.遍历中序线索二叉树5.树的先根遍历和后根遍历6.树T的叶子结点个数7.计算一棵以孩子兄弟表示的树T的度,该算法的时间复杂度为O(n)8.计算树孩子兄弟链表表示的T......
  • Bocha Web Search API:使用Langchain的Agent模式通过Tool Use调用博查 Search API实现L
    上篇文章介绍了国内可用的博查WebSearchAPI,详见:使用博查WebSearchAPI获取搜索引擎的网页链接和文本摘要,给AI/RAG应用增加联网搜索功能本篇讲述一下如何通过LangChain的FunctionCall方式使用它。1.安装LangChainpipinstalllangchainopenai2.获取博查......
  • 使用博查Web Search API获取搜索引擎的网页链接和文本摘要,给AI/RAG应用增加联网搜索功
    为什么需要WebSearchAPI?各类AINative应用、RAG应用、AIAgent智能体在开发过程都会遇到联网获取互联网网页信息的需求,此时需要得到原始网页链接以及文本摘要,以用于给pipeline中的大模型作为上下文总结使用。但目前仅国外的搜索引擎例如Bing、Google提供此类WebSearch......
  • WordPress WP_Query自定义搜索多个关键词
    WP_Query是 WordPress 中用于查询文章和自定义内容的核心类。它提供了强大的查询能力,允许开发者以多种方式从数据库中检索和展示内容。WP_Query支持广泛的查询参数,可以用于获取文章、页面、自定义文章类型等。所以通过WP_Query可以创建复杂的搜索功能,以便根据各种条件检索内......
  • [Python手撕]二叉搜索树中的众数
    给你一个含重复值的二叉搜索树(BST)的根节点root,找出并返回BST中的所有众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按任意顺序返回。假定BST满足如下定义:结点左子树中所含节点的值小于等于当前节点的值结点右子树中所含节点的值大于等于当前节点的值左......
  • 基于网格搜索优化最小二乘向量机(GS-LSSVM)的数据多变量回归预测 Matlab代码(多输入单
    基于网格搜索优化最小二乘向量机(GS-LSSVM)的数据多变量回归预测Matlab代码(多输入单输出)程序已经调试好,无需更改代码替换数据集即可运行!!!数据格式为excel!网格搜索GS优化参数为:sigma、gamma1.购买前GS可以更换为其他的优化算法!需要其他算法的都可以定制!注:1️⃣、运行环境要......
  • 代码随想录算法训练营day16| 513.找树左下角的值 112.路径总和 106.从中序和后序
    学习资料:https://programmercarl.com/0513.找树左下角的值.html#算法公开课递归、回溯返回值:True/False,root构建二叉树TrueNode(root_value)513.找树左下角的值(实例变量self.result,self.maxdepth;找到叶子节点,若深度>self.maxdepth,则更新最大深度;只考虑左和右子树,用递归+......
  • [LeetCode] 662. 二叉树最大宽度
    题目描述:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。树的 最大宽度 是所有层中最大的 宽度 。每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这......