首页 > 编程语言 >代码随想录算法训练营第18天 | 、98验证二叉树、700. 二叉搜索树中的搜索

代码随想录算法训练营第18天 | 、98验证二叉树、700. 二叉搜索树中的搜索

时间:2024-06-23 12:10:19浏览次数:3  
标签:right nums self 随想录 搜索 二叉树 root left

代码随想录算法训练营第20天 |

654.最大二叉树
https://leetcode.cn/problems/maximum-binary-tree/
654.最大二叉树代码随想录
https://programmercarl.com/0654.最大二叉树.html
617.合并二叉树
https://leetcode.cn/problems/merge-two-binary-trees/description/
617.合并二叉树代码随想录
https://programmercarl.com/0617.合并二叉树.html
98.验证二叉树
https://leetcode.cn/problems/validate-binary-search-tree/description/
98.验证二叉树代码随想录
https://programmercarl.com/0098.验证二叉搜索树.html#算法公开课
700.二叉搜索树中的搜索
https://leetcode.cn/problems/search-in-a-binary-search-tree/description/
700.二叉搜索树中的搜索
https://programmercarl.com/0098.验证二叉搜索树.html#算法公开课

654.最大二叉树

题目

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。

题解重点:

  • 递归法:trans函数 返回参数即可

题解代码:

递归法

class Solution:
    def trans(self,nums,left,right):
        if left>=right:
            return None
        max_index = left
        for i in range(left+1,right):
            if nums[i]>nums[max_index]:
                max_index = i
        root = TreeNode(nums[max_index])
        root.left = self.trans(nums,left,max_index)
        root.right = self.trans(nums,max_index+1,right)
        return root
    def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
        return self.trans(nums,0,len(nums))

617.合并二叉树

题目

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。

题解重点

  • 递归法:前中后序都可以 只要遍历两棵树即可
  • 迭代法:队列模拟层序遍历;两个都存在就存进去;不一样的子树,从右边直接挪到左边来;

题解代码

递归法

class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root1 and not root2:
            return None
        if not root1:
            return root2
        if not root2:
            return root1
        if root1 and root2:
            root = TreeNode(root1.val+root2.val)
            root.left = self.mergeTrees(root1.left,root2.left)
            root.right = self.mergeTrees(root1.right,root2.right)
        return root

迭代法

class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root1:
            return root2
        if not root2:
            return root1
        que = collections.deque()
        que.append(root1)
        que.append(root2)
        while que:
            node1 = que.popleft()
            node2 = que.popleft()
            if node1.left and node2.left:
                que.append(node1.left)
                que.append(node2.left)
            if node1.right and node2.right:
                que.append(node1.right)
                que.append(node2.right)
            node1.val += node2.val
            if not node1.left and node2.left:
                node1.left = node2.left
            if not node1.right and node2.right:
                node1.right = node2.right
        return root1

700.二叉搜索树

题目

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

题解:

  • 按照树的性质运行即可

题解代码:

递归法

class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root or root.val==val:
            return root
        if val<root.val:
            return self.searchBST(root.left,val)
        if val>root.val:
            return self.searchBST(root.right,val)

迭代法

class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        while root:
            if val<root.val:
                root = root.left
            elif val>root.val:
                root = root.right
            else:
                return root
        return root

98.验证二叉搜索树

题目

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树

题解

  • 注意有坑!整个左子树上的数字都不能大于右子树。也就是说:左子树的右子树也应该小于根节点;
  • 递归法:建立统一变量;
  • 迭代法:栈+ curr pre节点对比

题解代码:

class Solution:
    def __init__(self):
        self.vec = []

    def trans(self,root):
        if not root:
            return True
        self.trans(root.left)
        self.vec.append(root.val)
        self.trans(root.right)

    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        self.vec = []
        self.trans(root)
        for i in range(1,len(self.vec)):
            if self.vec[i]<=self.vec[i-1]:
                return False
        return True
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        st = []
        pre = None
        curr = root
        while curr or len(st)>0:
            if curr:
                st.append(curr)
                curr = curr.left
            else:
                curr = st.pop()
                if pre and curr.val<=pre.val:
                    return False
                pre = curr
                curr = curr.right
        return True

标签:right,nums,self,随想录,搜索,二叉树,root,left
From: https://www.cnblogs.com/P201821440041/p/18263226

相关文章

  • 代码随想录63——二叉树4——迭代遍历
    ......
  • 【微服务】第24节:初识搜索引擎 ElasticSearch
    目录1.初识elasticsearch1.1.认识和安装1.1.1.安装elasticsearch1.1.2.安装Kibana1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排1.3.基础概念1.3.1.文档和字段1.3.2.索引和映射1.3.3.mysql与elasticsearch1.4.IK分词器1.4.1.安装IK分词器1.4.2.使......
  • 代码随想录第13天 | 二叉树part01 基础和遍历
    二叉树基础知识二叉树种类满二叉树满二叉树:如果一棵二叉树只有度为0和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树(子节点要么为0,要么为2)若满二叉树的深度为k(即k层,从1开始),则其节点个数为:2^k-1完全二叉树完全二叉树:从上到下,从左到右,都是连续的。满二叉树一......
  • 【广度优先搜索 深度优先搜索 图论】854. 相似度为 K 的字符串
    本文涉及知识点广度优先搜索深度优先搜索图论图论知识汇总深度优先搜索汇总C++BFS算法LeetCode854.相似度为K的字符串对于某些非负整数k,如果交换s1中两个字母的位置恰好k次,能够使结果字符串等于s2,则认为字符串s1和s2的相似度为k。给你两个字母......
  • MCT Self-Refine:创新集成蒙特卡洛树搜索 (MCTS)提高复杂数学推理任务的性能,超GPT4,使用 L
    ......
  • 针对Bing必应搜索引擎SEO简易教学方式
    《深入剖析Bing必应搜索引擎及其优化策略》在国内的网络环境中,当我们提及搜索引擎时,大多数人首先会想到百度。然而,其他的搜索引擎也不容忽视,其中Bing(必应)就是一个具有独特特点和重要性的存在。Bing作为微软旗下的搜索引擎,自2009年以谷歌替代品的身份登场以来,一直在稳......
  • django中关于全文检索的实现(搜索)
    全文检索全文检索不同于特定字段的模糊查询,使用全文检索的效率高,并且能够对中文进行分词处理haystack:django的一个包,可以方便地对model 里面的内容进行索引,搜索,设计为whoosh,solr,Xapian,Elasticsearc四种全文检索引擎后端,属于全文检索的框架whoosh:是纯python编写的全文......
  • [AI资讯·0622] Claude3.5超越GPT-4o,360推出AI搜索,OpenAI收购Rockset,华为发布大模型
    AI资讯「网红」周鸿祎,要为AI带货突发!OpenAI收购数据公司盘古5.0重磅发布!华为云大模型年度杀招来了,人形机器人现场整活GPT-4o一夜被赶超!Anthropic推出Claude3.5,网友3分钟克隆马里奥游戏中国人自己的操作系统!余承东掏出纯血鸿蒙,华为AI大招硬刚苹果Claude3.5突然发布!GPT-4o......
  • C/C++ stack实现深度优先搜索DFS算法详解及源码
    深度优先搜索(DepthFirstSearch,DFS)是一种图遍历算法,它从一个节点开始,通过访问其相邻节点的方式,依次深入到图中的更深层次。Stack(栈)是一种先进后出(LastInFirstOut,LIFO)的数据结构,它非常适合实现DFS算法。首先,我们来解释一下Stack实现DFS算法的原理。DFS算法的核心思想是......
  • 代码随想录算法训练营第十四天 | 226.翻转二叉树 101.对称二叉树 104.二叉树的最大深
    226.翻转二叉树题目:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。解题:思路:遍历的过程中交换每个节点的左右孩子。选择哪种遍历方式?中序不行,左中右,左边子节点交换完,处理中间交换了左节点和右节点,再处理右节点去交换时这个右节点就是原来的左节点,所以有一边就一......