训练营第二十天(二叉树 part06)

news2025/2/24 4:05:57

训练营第二十天(二叉树 part06)

654.最大二叉树

力扣题目地址(opens new window)

题目

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  • 二叉树的根是数组中的最大元素。
  • 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  • 右子树是通过数组中最大值右边部分构造出的最大二叉树。

通过给定的数组构建最大二叉树,并且输出这个树的根节点。

示例 :

在这里插入图片描述

提示:

给定的数组的大小在 [1, 1000] 之间。

解答

方法一:

每次传入的参数是新的数组

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
		if (nums.length == 0){
			return null;
		}
		int max = Integer.MIN_VALUE;
		int index = -1;
		for (int i = 0; i < nums.length; i++) {
			if (max < nums[i]){
				index = i;
				max = nums[i];
			}

		}
		TreeNode root = new TreeNode(nums[index]);
		int[] left = Arrays.copyOfRange(nums,0,index);
		int[] right = Arrays.copyOfRange(nums,index + 1,nums.length);
		root.left = constructMaximumBinaryTree(left);
		root.right = constructMaximumBinaryTree(right);
		return root;
    }
}
方法二:

不改变数组,每次根据传入的索引来确定新的数组

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
		return constructMaximumBinaryTree1(nums, 0, nums.length);//左闭右开
    }

	private TreeNode constructMaximumBinaryTree1(int[] nums,int leftIndex, int rightIndex){
		if (rightIndex - leftIndex < 1)//如果是等于1,那么就是只有一个元素,小于1就是没有元素
			return null;
		if (rightIndex - leftIndex == 1) {// 只有一个元素,这个if感觉可写可不写
			return new TreeNode(nums[leftIndex]);
		}
		int maxIndex = leftIndex;
		int max = nums[leftIndex];
		for (int i = leftIndex + 1; i < rightIndex; i++) {
			if (max < nums[i]){
				max = nums[i];
				maxIndex = i;
			}
		}
		TreeNode root = new TreeNode(max);
		root.left = constructMaximumBinaryTree1(nums,leftIndex,maxIndex);
		root.right = constructMaximumBinaryTree1(nums,maxIndex + 1,rightIndex);
		return root;
	}
}

617.合并二叉树

力扣题目链接(opens new window)

题目

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:

在这里插入图片描述

注意: 合并必须从两个树的根节点开始

解答

正常的先序递归

class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
		if(root1 == null && root2 == null)//两个都为空
			return null;
		if (root1 == null)//1为空,2不为空
			return root2;
		if (root2 == null)//2为空,1不为空
			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;
    }
}

700.二叉搜索树中的搜索

力扣题目地址(opens new window)

题目

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

例如,

在这里插入图片描述

在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。

解答

递归
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
		if (root == null)
			return null;
		if (root.val == val)
			return root;
		else if (root.val < val)
			return searchBST(root.right,val);
		else
			return searchBST(root.left,val);
    }
}
迭代
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
		while (root != null){
			if (root.val == val)
				return root;
			else if (root.val < val)
				root = root.right;
			else
				root = root.left;
		}
		return null;
    }
}

98.验证二叉搜索树

力扣题目链接(opens new window)

题目

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

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

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

在这里插入图片描述

解答

注意陷阱,下面的代码就是我的一个误区,误以为只要当前子树的根大于左子树,小于右子树即可,实际上要确保根结点要小于所有右子树的结点,大于所有左子树结点

错误代码
class Solution {
    public boolean isValidBST(TreeNode root) {
		if (root == null)
			return true;
		int val = root.val;
		boolean leftFlag;
		boolean rightFlag;
		if (root.left == null || root.left.val < val)
			leftFlag = isValidBST(root.left);
		else
			return false;

		if (root.right == null || root.right.val > val)
			rightFlag = isValidBST(root.right);
		else
			return false;

		return leftFlag && rightFlag;
    }
}
递归法

注意二叉搜索树使用中序遍历时是一个递增的序列

class Solution {
	TreeNode max;//max的值永远都应该是小于当前结点的,因为是中序,永远是递增
    public boolean isValidBST(TreeNode root) {
		if (root == null)
			return true;
		//使用中序遍历
		if (!isValidBST(root.left))
			return false;//左子树不满足

		if (max != null && max.val >= root.val)
			return false;
		max = root;//max为空
		
		//此时左子树和根都判断完了
		return isValidBST(root.right);
    }
}


// 简洁实现·中序遍历
class Solution {
    private long prev = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        if (!isValidBST(root.left)) {
            return false;
        }
        if (root.val <= prev) { // 不满足二叉搜索树条件
            return false;
        }
        prev = root.val;
        return isValidBST(root.right);
    }
}
迭代法
class Solution {
    public boolean isValidBST(TreeNode root) {
		if (root == null)
			return true;
		Stack<TreeNode> stack = new Stack<>();
		TreeNode max = null;
		while (root != null || !stack.isEmpty()){
			while (root != null){
				stack.push(root);
				root = root.left;//一直将左节点放入栈中
			}

			//中
			TreeNode cur = stack.pop();//这个是最后一个左子树的中间结点
			if (max != null && cur.val <= max.val)
				return false;
			max = cur;

			root = cur.right;//右
		}
		return true;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯第十三届c++大学B组详解

目录 1.九进制转十进制 2.顺子日期 3.刷题统计 4.修剪灌木 5.x进制的减法 6.统计子矩阵 7.积木画 8.扫雷 9.李白打酒 10.砍竹子 1.九进制转换十进制 题目解析&#xff1a;就是将2022的每一位拿出来乘以9的n-1次方的和就是最终答案。次方是从0开始的到n-1. #include &…

OpenLayers6实战,OpenLayers实现鼠标拖拽方式绘制平行四边形

专栏目录: OpenLayers实战进阶专栏目录 前言 本章介绍如何使用OpenLayers在地图上使用实现鼠标拖拽方式绘制平行四边形。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使用Yarn安装依赖yarn add olvue中如何使用: vue项目…

Unity单个物体绑定多个相机在轨道上移动,录制不同角度视频

环境搭建 下载Cinemachine插件安装 打开包管理器 下载cinemachine插件 创建轨道 使用dolly track 创建轨道 右侧可以删减关键点&#xff0c;注意调整y坐标 创建cart 把前面的轨道拖到path中&#xff0c;注意这里的speed要设定不为0才会动 设置VItual Camera 根据需…

win11 怎么去除桌面上的了解此图片

如上图,更新win11后换上了壁纸,却发现这么个鬼玩意儿,还没有删除选项 因为这个了解此图片,是win11个性化壁纸的功能 当你使用win11的壁纸选项是windows聚焦后,桌面就会出现这个 取消这个就行 选择纯色或者图片 就没有了,我干干净净的桌面

DAS-MIL

DAS-MIL论文笔记 题目&#xff1a;DAS-MIL: Distilling Across Scales for MIL Classification of Histological WSIs 摘要 近年来&#xff0c;采用多实例学习 &#xff08;MIL&#xff09; 对全玻片图像 &#xff08;WSI&#xff09; 进行分类的情况有所增加。事实上&#…

速锐得解码荣威新I5燃油版OBD数据助力驾校现代化数字教学

在当今这个信息化飞速发展的时代&#xff0c;技术的进步不仅改变了我们的生活方式&#xff0c;也深刻影响了各行各业的运作模式。驾驶教育行业亦是如此&#xff0c;其中&#xff0c;OBD&#xff08;On-Board Diagnostics&#xff0c;车载自动诊断系统&#xff09;数据的应用&am…

MySQL-mysql 8.0.11安装教程

网上的教程有很多&#xff0c;基本上大同小异。但是安装软件有时就可能因为一个细节安装失败。我也是综合了很多个教程才安装好的&#xff0c;所以本教程可能也不是普遍适合的。 安装环境&#xff1a;win 10 1、下载zip安装包&#xff1a; MySQL8.0 For Windows zip包下载地…

一篇文章让你搞懂性能测试6大类型及其关系!

性能测试是软件测试过程的一个关键环节&#xff0c;用于确定和验证应用程序或系统在各种操作条件下的性能特征。 目标是确保软件在高负载、高压力、长时间运行以及其他非标准情况下仍能保持预期的行为和效率。 一. 性能测试的主要类型 1. 基线测试&#xff08;Baseline Test…

引领车载影像革命,全链路解决方案助力座舱创新升级

影像技术的创新与突破正在引领各行各业的飞速发展&#xff0c;尤其对于汽车行业来说&#xff0c;车载影像系统已成为衡量车辆智能化水平的重要指标。为了满足这一日益增长的需求&#xff0c;美摄科技凭借深厚的研发实力与创新精神&#xff0c;推出了全链路的车载影像解决方案&a…

React 使用 three.js 加载 gltf 3D模型 | three.js 入门

系列文章 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制 示例项目(gitcode)&#xff1a;https://gitcode.com/qq_41456316/simple-react-three-demo 文章目录 系列文章前言一、three.js是什么&…

【简单讲解下Symfony框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

C++11 数据结构0 什么是 “数据结构“?数据,数据对象,数据元素,数据项 概念。算法的基本概念 和 算法的度量,大O表示法,空间换时间的代码

数据&#xff1a; 是能输入计算机且能被计算机处理的各种符号的集合。数值型的数据&#xff1a;整数和实数。非数值型的数据&#xff1a;文字、图像、图形、声音等。 数据对象&#xff1a; 性质相同的 "数据元素" 的集合 例如一个 int arr[10], Teacher tea[3]; 数…

算法:计数类dp

文章目录 一、举个栗子例子1&#xff1a;爬楼梯问题例子2&#xff1a;不同路径例子3&#xff1a;计数子序列 二、基本思路三、典型例题一、ACWing&#xff1a;900. 整数划分1、解法一1.1、状态转移方程1.2、参考代码 O(n) 超时 2、解法二&#xff1a;类似完全背包问题1.1、状态…

YOLOv8 推理脚本--置信度保留多位浮点数 特征图可视化

效果 特征图可视化: 4位浮点数: 原始2位浮点数4位浮点数推理 --detect.py 说明 在进行改动前,请大家先阅读下 基础入门篇 | YOLOv8 项目【训练】【验证】【推理】最简单教程 | YOLOv8必看 | 最新更新,直接打印 FPS,mAP50,75,95 ,确保会用我给的推理脚本。 YOLO( ):…

ChatGPT在日常生活与工作中的应用,以及Hulu AI 的探索之旅

ChatGPT在日常生活与工作中的应用&#xff0c;以及Hulu AI 的探索之旅 &#x1f4ac;ChatGPT 的多面应用&#x1f4ac;Hulu AI&#xff1a;一个AI工具聚合平台的探索平台优势为何选择Hulu AI&#xff1f;珍稀优惠 &#x1f4ac;结束语 在数字化快速发展的当下&#xff0c;人工智…

苍穹外卖开发笔记(1.项目介绍和开发环境)

目录 一、项目介绍二、环境搭建1、web管理端前端部署2、后端环境搭建3、数据库搭建4、前后端联调5、导入接口文档 三、完善登录功能四、学习知识1、前端发送的请求&#xff0c;是如何请求到后端服务的&#xff1f; 一、项目介绍 二、环境搭建 由于本项目主要点在于学习后端开发…

React + three.js 3D模型面部表情控制

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制 示例项目(github)&#xff1a;https://github.com/couchette/simple-react-three-facial-expression-demo 示例项目(gitcode)&#xff…

ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token

前言 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络上以 JSON 对象的形式安全地传输信息。 JWT 通常用于在用户和服务器之间传递身份验证信息&#xff0c;以便在用户进行跨域访问时进行身份验证。 JWT 由…

力扣--图论/Prim1584.连接所有点的最小费用

思路分析&#xff1a; 初始化&#xff1a;获取点的数量&#xff0c;并创建两个辅助数组 adjvex 和 lowcost&#xff0c;分别用于记录最小生成树的边信息和每个顶点到最小生成树的距离。Prim算法循环&#xff1a;在每一次循环中&#xff0c;选择一个未加入最小生成树的顶点 k&a…

HTML5+CSS3+JS小实例:图片切换特效之模糊变清晰

实例:图片切换特效之模糊变清晰 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, i…