代码学习记录16

随想录日记part16

t i m e : time: time 2024.03.11



主要内容:今天的主要内容是二叉树的第五部分,主要涉及最大二叉树;合并二叉树;二叉搜索树的搜索;验证二叉搜索树。

  • 654.最大二叉树
  • 617.合并二叉树
  • 700.二叉搜索树中的搜索
  • 98.验证二叉搜索树


Topic1最大二叉树

题目:

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

  • 创建一个根节点,其值为 n u m s nums nums 中的最大值。
  • 递归地在最大值左边的数组前缀上构建左子树。
  • 递归地在最大值右边的子数组后缀上构建右子树.

返回 nums 构建的 最大二叉树 。
示例:
请添加图片描述

输入: n u m s = [ 3 , 2 , 1 , 6 , 0 , 5 ] nums = [3,2,1,6,0,5] nums=[3,2,1,6,0,5]
输出: [ 6 , 3 , 5 , n u l l , 2 , 0 , n u l l , n u l l , 1 ] [6,3,5,null,2,0,null,null,1] [6,3,5,null,2,0,null,null,1]

思路:

最大二叉树的构建过程如下:请添加图片描述
构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。

  • 确定递归函数的参数和返回值
TreeNode constructMaximumBinaryTree(int[] nums)
  • 确定终止条件
   // 1,如果数组大小为0,说明为空节点;
   if (begin >= end) return null;
  • 确定单层递归的逻辑:1.先要找到数组中最大的值和对应的下标;2,最大值所在的下标左区间 构造左子树;3.最大值所在的下标右区间 构造右子树
   // 2.找出其中最大值对应的索引
   int index = MaxValueIndex(nums, begin, end);
   TreeNode tem = new TreeNode(nums[index]);
   //3.最大值所在的下标左区间 构造左子树
   tem.left = createMaxTree(nums, begin, index);
   //4.最大值所在的下标右区间 构造右子树
   tem.right = createMaxTree(nums, index + 1, end);

总体代码如下:

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return createMaxTree(nums, 0, nums.length);
    }

    private TreeNode createMaxTree(int[] nums, int begin, int end) {// 左闭右开
        // 1,如果数组大小为0,说明为空节点;
        if (begin >= end)
            return null;
        // 2.找出其中最大值对应的索引
        int index = MaxValueIndex(nums, begin, end);
        TreeNode tem = new TreeNode(nums[index]);
        tem.left = createMaxTree(nums, begin, index);
        tem.right = createMaxTree(nums, index + 1, end);
        return tem;
    }

    private int MaxValueIndex(int[] nums, int begin, int end) {// 查找最大值的对应索引的函数
        int maxKey = -1;
        int maxValue = Integer.MIN_VALUE;
        for (int i = begin; i < end; i++) {
            if (nums[i] > maxValue) {
                maxValue = nums[i];
                maxKey = i;
            }
        }
        return maxKey;
    }
}


Topic2合并二叉树

题目:

给你两棵二叉树: r o o t 1 root1 root1 r o o t 2 root2 root2
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 n u l l null null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。

请添加图片描述

输入: r o o t 1 = [ 1 , 3 , 2 , 5 ] , r o o t 2 = [ 2 , 1 , 3 , n u l l , 4 , n u l l , 7 ] root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7] root1=[1,3,2,5],root2=[2,1,3,null,4,null,7]
输出: [ 3 , 4 , 5 , 5 , 4 , n u l l , 7 ] [3,4,5,5,4,null,7] [3,4,5,5,4,null,7]

思路:

使用前序遍历的方法构建,其动画如下:
请添加图片描述

  • 确定递归函数的参数和返回值
TreeNode mergeTrees(TreeNode root1, TreeNode root2)
  • 确定终止条件
if (root1 == null && root2 == null)
	return null;
if (root1 == null && root2 != null)
	return root2;
if (root1 != null && root2 == null)
	return root1;
  • 确定单层递归的逻辑:创建一个新的节点来记录。
  TreeNode root = new TreeNode(root1.val + root2.val);
  root.left = mergeTrees(root1.left, root2.left);
  root.right = mergeTrees(root1.right, root2.right);

总体代码如下: 递归法:

class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if (root1 == null && root2 == null)
            return null;
        if (root1 == null && root2 != null)
            return root2;
        if (root1 != null && root2 == null)
            return root1;
        TreeNode root = new TreeNode(root1.val + root2.val);
        root.left = mergeTrees(root1.left, root2.left);
        root.right = mergeTrees(root1.right, root2.right);
        return root;
    }
}


Topic3二叉搜索树中的搜索

题目:

给定二叉搜索树( B S T BST BST)的根节点 r o o t root root 和一个整数值 v a l val val。你需要在 B S T BST BST 中找到节点值等于 v a l val val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 n u l l null null
示例:
请添加图片描述

输入: r o o t = [ 4 , 2 , 7 , 1 , 3 ] , v a l = 2 root = [4,2,7,1,3], val = 2 root=[4,2,7,1,3],val=2
输出: [ 2 , 1 , 3 ] [2,1,3] [2,1,3]

思路:

递归法:直接递归就行,不难。

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if (root == null)
            return null;
        if (root.val == val)
            return root;
        else {
            TreeNode left = searchBST(root.left, val);
            TreeNode right = searchBST(root.right, val);
            if (left != null)
                return left;
            else
                return right;
        }
    }
}


Topic4验证二叉搜索树

题目:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:

  • 节点的左子树只包含小 当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。
    示例:
    请添加图片描述

输入: r o o t = [ 5 , 1 , 4 , n u l l , n u l l , 3 , 6 ] root = [5,1,4,null,null,3,6] root=[5,1,4,null,null,3,6]
输出: f a l s e false false
解释: 根节点的值是 5 5 5 ,但是右子节点的值是 4 4 4

思路:

中序遍历是符合二叉搜索树的查找规则的。

  • 确定递归函数的参数和返回值
boolean isValidBST(TreeNode root)
  • 确定终止条件
 if (root == null) return true;
  • 确定单层递归的逻辑:中序遍历,一直更新 $max%,一旦发现 m a x . v a l > = r o o t . v a l max.val>= root.val max.val>=root.val,就返回 f a l s e false false,注意元素相同时候也要返回 f a l s e false false
        // 左
        boolean left = isValidBST(root.left);
        if (left != true)
            return false;
        // 中
        if (max != null && max.val >= root.val)
            return false;
        max = root;
        // 右
        return isValidBST(root.right);

整体的代码如下:

class Solution {
    TreeNode max;

    public boolean isValidBST(TreeNode root) {
        if (root == null)
            return true;
        // 中序遍历
        // 左
        boolean left = isValidBST(root.left);
        if (left != true)
            return false;
        // 中
        if (max != null && max.val >= root.val)
            return false;
        max = root;
        // 右
        return isValidBST(root.right);
    }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/458695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用docker-compose部署Redis集群

一、部署三主三从的Redis集群 分别为6个节点建立挂载目录&#xff0c;每个目录下建立数据、配置、日志文件夹。 docker-compose内容如下&#xff1a; version: 3 services:redis1:image: redis:6.2.3restart: alwaysports:- "6379:6379"- "16379:16379"v…

Spring揭秘:ClassPathScanningProvider接口应用场景及实现原理!

技术应用场景 ClassPathScanningCandidateComponentProvider是Spring框架中一个非常核心的类&#xff0c;它主要用于在类路径下扫描并发现带有特定注解的组件&#xff0c;支持诸如ComponentScan、Component、Service、Repository和Controller等注解的自动扫描和注册。 ClassP…

.NET开源快速、强大、免费的电子表格组件

今天大姚给大家分享一个.NET开源&#xff08;MIT License&#xff09;、快速、强大、免费的电子表格组件&#xff0c;支持数据格式、冻结、大纲、公式计算、图表、脚本执行等。兼容 Excel 2007 (.xlsx) 格式&#xff0c;支持WinForm、WPF和Android平台&#xff1a;ReoGrid。 项…

普发Pfeiffer TPG256A MaxiGauge 真空计控制器接口通讯针脚等详情见图目录

普发Pfeiffer TPG256A MaxiGauge 真空计控制器接口通讯针脚等详情见图目录

强化学习中SARSA(State-Action-Reward-State-Action)和Q-learning的区别

SARSA&#xff08;State-Action-Reward-State-Action&#xff09;和Q-learning是两种经典的强化学习算法&#xff0c;它们都用于学习最优策略以使智能体在一个环境中获得最大的累积奖励。它们之间的主要区别在于它们更新动作值函数&#xff08;Q值函数&#xff09;的方式以及其…

SwiftUI组件-DatePicker

SwiftUI组件-DatePicker 本文记录一下SwiftUI组件-DatePicker import SwiftUIstruct DatePickerBootCamp: View {State var selectedDate: Date Date()var dateFormatter: DateFormatter {let formatter DateFormatter()formatter.dateStyle .shortformatter.timeStyle .…

使用kill()函数向进程发送信号

本片文章的学习记录总结来源于&#xff1a;https://www.bilibili.com/cheese/play/ep182660?csourcecommon_hp_history_null&t11&spm_id_from333.1007.top_right_bar_window_history.content.click 通常在Linux系统中&#xff0c;可以使用 kill or killall 命令向指定…

OpenCASCADE开发指南<十二>:OCC创建三维瓶子模型

在OpenCASCADE有一个例程&#xff0c;在 官方帮助网站中可以找到。程将教你如何使OpenCASCADE的API来进行三维建模。教程的目的不是描述所有的类&#xff0c;而是帮助你思考如何将OpenCASCADE作为一种工具。 1 概述 利用OpenCASCADE的API创建一个三维瓶子&#xff0c;形状如下…

如何在Linux部署DataEase数据分析服务并实现无公网IP远程分析内网数据信息

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

IBM:《2024年消费者调研:无处不在的人工智能彻底变革零售业》

1月17日&#xff0c;IBM商业价值研究院最近发布了第三份两年一度的消费者调研报告。 这项名为《无处不在的人工智能彻底改变零售业&#xff1a;客户不会等待》的报告&#xff0c;对包含中国在内的全球近20000名消费者进行了调研&#xff0c;相关结果反映了消费者对零售体验的普…

【Python】进阶学习:一文了解NotImplementedError的作用

【Python】进阶学习&#xff1a;一文了解NotImplementedError的作用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…

2020-11-08 字符串指定位置倒序输出

缘由https://bbs.csdn.net/topics/398165677 //字符串指定位置倒序输出缘由https://bbs.csdn.net/topics/398165677char aa[] "abcABCabc\n";int a 3, b 5, c 0, d b;while (aa[c] ! \n)if (c < a || c > b)cout << aa[c]; else if(d > a) cout …

目标检测——YOLOv4算法解读

论文&#xff1a;YOLOv4&#xff1a;Optimal Speed and Accuracy of Object Detection 作者&#xff1a;Alexey Bochkovskiy, Chien-Yao Wang, Hong-Yuan Mark Liao 链接&#xff1a;https://arxiv.org/pdf/2004.10934.pdf 代码&#xff1a;https://github.com/AlexeyAB/darkne…

弹性盒子布局 Flexbox Layout

可以嵌套下去 1.display 属性 默认行排列 <style>.flex-item{ height: 20px;width: 10px;background-color: #f1f1f1;margin: 10px;}</style> </head> <body> <div class"flex-container"><div class"flex-item">1&l…

如何实现固定公网地址远程SSH连接Linux Deepin系统

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统&#xff0c;专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…

探索数据结构:双向链表的灵活优势

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 前言 前面我们学习了单链表&#xff0c;它解决了顺序表中插入删除需…

第110讲:Mycat实践指南:指定Hash算法分片下的水平分表详解

文章目录 1.应用指定Hash算法分片的概念2.使用应用指定Hash算法分片对某张表进行水平拆分2.1.在所有的分片节点中创建表结构2.2.配置Mycat实现应用指定Hash算法分片的水平分表2.2.1.配置Schema配置文件2.2.2.配置Rule分片规则配置文件2.2.3.配置Server配置文件2.2.4.重启Mycat …

什么牌子的蓝牙耳机质量好?2024年精选机型,真实体验分享

​对于新手来说&#xff0c;真无线蓝牙耳机的选购可能显得有些复杂。网络上有许多关于蓝牙耳机品牌、音质、舒适度的讨论。我整理了五款佩戴舒适且音质表现不错的真无线蓝牙耳机&#xff0c;希望能为你提供有价值的参考&#xff0c;不要错过哦&#xff01; 一、蓝牙耳机选购技巧…

训练YOLOv8m时AMP显示v8n

在训练Yolov8模型时&#xff0c;使用AMP&#xff08;Automatic Mixed Precision&#xff09;可以加速训练过程并减少显存的使用。AMP是一种混合精度训练技术&#xff0c;它通过将模型参数的计算转换为低精度&#xff08;如半精度&#xff09;来提高训练速度&#xff0c;同时保持…

es 分词器详解

基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 分词器发生的时期 1、分词…