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

训练营第二十天(二叉树 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);elsereturn 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;elseroot = 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);elsereturn false;if (root.right == null || root.right.val > val)rightFlag = isValidBST(root.right);elsereturn 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.mzph.cn/news/808037.shtml

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

相关文章

sed 字符替换时目标内容包含 特殊字符怎么处理

背景 想写一个自动修改配置的脚本&#xff0c;输入一个 mysql jdbc 的连接路径&#xff0c;然后替换目标配置中的模版内容&#xff0c;明明很简单的一个内容&#xff0c;结果卡在了 & 这个符号上。 & 到底是什么特殊字符呢&#xff1f;结论&#xff1a;它代表要替换的…

【中级软件设计师】上午题08-UML(上):类图、对象图、用例图

上午题08-UML 1 UML事物2 UML关系2.1 依赖2.2 关联2.2.1 聚合 &#xff08;空心菱形&#xff09;2.2.2 组合 &#xff08;实心菱形&#xff09; 2.3 泛化 &#xff08;实线三角形&#xff09;2.4 实现 &#xff08;虚线三角形&#xff09;2.5 关联多重度 3 类图4 对象图5 用例图…

vue3 + potree 渲染点云数据记录

potree 官网示例 前置条件&#xff1a; potree 无法直接加载 LAS&#xff0c;LCD&#xff0c;PLY等格式的点云文件, 需要通过 PotreeConverte 转换为 octree 数据格式&#xff0c;前端渲染中加载转换后的 json 格式 格式转换方向 .las ---- potreeConverter ----> .json…

算法练习第15天|226.翻转二叉树

226.翻转二叉树 力扣链接https://leetcode.cn/problems/invert-binary-tree/description/ 题目描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&am…

关于无人机,你必须知道的事!!(科技篇)

飞行器的五脏六腑 电机&#xff1a;无人机的动力单元&#xff0c;俗称“马达”。通过电机转动来驱动螺旋桨旋转&#xff0c;最终让飞机上天。 电调&#xff1a;无人机的动力单元&#xff0c;是接收油门信号并调整电机转速的控制枢纽&#xff0c;俗称电机的“黑屋调教师” 飞…

探索计算机的小数世界:从二进制到无限精度

前言 不知道你是否和我一样&#xff0c;遇到这个情况。在刚开始学习编程。计算0.3-0.20.1这个小学都知道&#xff0c;但是如果你在计算机执行&#xff0c;发现结果并不是0.1 。这个时候会疑问到底是为什么呢。 System.out.println("0.3-0.2"(0.3-0.2)); 0.3-0.20.09…

API管理平台:你用的到底是哪个?

Apifox是不开源的&#xff0c;在github的项目只是readme文件&#xff0c;私有化需要付费。当然saas版目前是免费使用的。 一、Swagger 为了让Swagger界面更加美观&#xff0c;有一些项目可以帮助你实现这一目标。以下是一些流行的项目&#xff0c;它们提供了增强的UI和额外的功…

OSCP靶场-- Sybaris

OSCP靶场–Sybaris 考点(redis MODULE LOAD命令执行) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.158.93 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-11 04:24 EDT Nmap scan report for 192.168.158.93…

照片转漫画的软件有吗?分享4款热门的软件!

在数字化时代&#xff0c;我们总是追求新鲜、有趣、创意十足的方式来展现自我。其中&#xff0c;将普通照片转化为漫画风格的图像已成为许多年轻人的新宠。这种既能保留原照片中的人物特征&#xff0c;又能赋予其独特艺术气息的方式&#xff0c;让许多人趋之若鹜。那么&#xf…

PHP7垃圾回收算法

前提 本文为了梳理PHP GC工作流程&#xff0c;所以从引用计数、部分标记清除算法做引子&#xff0c;然后介绍PHP GC工作流程,最后介绍性能更高的GC算法 引用计数 概述 引用计数算法中引入了一个概念计数器。计数器代表对象被引用的次数 基本原理 为了记录一个对象有没有被…

微信公众号第三方平台-公众号扫码授权接入代运营

文章目录 接入目的效果展示技术积累如何成为服务商如何搭建第三方后端服务传统模式V云服务模式如何完成商家授权授权逻辑介绍 环境准备注册开发者平台-个人类型 传统模式后端代码接收公众号个人三方平台的票据根据票据获取三方平台访问令牌根据访问令牌获取预授权码通过预授权码…

OJ 【难度1】【Python】完美字符串 扫雷 A-B数对 赛前准备 【C】精密计时

完美字符串 题目描述 你可能见过下面这一句英文&#xff1a; "The quick brown fox jumps over the lazy dog." 短短的一句话就包含了所有 2626 个英文字母&#xff01;因此这句话广泛地用于字体效果的展示。更短的还有&#xff1a; "The five boxing wizards…

网络——初识网络

在现如今&#xff0c;网络已经成了一种基础设施&#xff0c;大到国家&#xff0c;小到个人&#xff0c;网络已经充斥在我们每个人的身 边&#xff0c;如果一个人突然失去了网络&#xff0c;那么它的生活或多或少会出现一些不方便的地方&#xff0c;网络现在已 经伴随着我们的吃…

Solana主网使用自定义的RPC进行转账

1、引言 如果用 browser 连接主网的 RPC server 会收到 error code 403 message 為 Access forbidden, contact your app developer or supportrpcpool.com. 错误&#xff0c;因为主网的 RPC server 会检查 HTTP Header 如果判断出來是 browser 就会报告 403 錯誤。 要解決这…

N 皇后 - 蓝桥杯?-Lua 中文代码解题第6题

n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2 解释&#xff1a;如上图所示&…

吴恩达2022机器学习专项课程(一) 5.2 向量化(1) 5.3 向量化(2)

问题预览/关键词 什么是向量化&#xff1f;向量化的好处是&#xff1f;如何向量化多元线性回归函数的参数&#xff1f;如何在Python中向量化参数&#xff1f;计算机底层是如何计算向量化的&#xff1f;向量化示例 笔记 1.向量化 一种在数学和计算中广泛使用的概念&#xff…

[Mac]安装App后“XX已损坏,无法打开“

问题&#xff1a; “xx.app”已损坏&#xff0c;无法打开。你应该将它移到废纸篓。 解决&#xff1a; 终端输入sudo xattr -r -d com.apple.quarantine 后将Applications中对应的问题app拖入生成路径&#xff0c;然后执行。 $ sudo xattr -r -d com.apple.quarantine /Appli…

备战蓝桥杯(日益更新)(刷题)

备战蓝桥杯&#xff08;日益更新&#xff09;&#xff08;刷题&#xff09; 文章目录 备战蓝桥杯&#xff08;日益更新&#xff09;&#xff08;刷题&#xff09;前言&#xff1a;一、二分&#xff1a;1. acwing503 借教室&#xff1a;&#xff08;二分 差分&#xff09;2. ac…

Socks5代理IP如何使用?详细教程解析

当我们在互联网上浏览网页、下载文件或者进行在线活动时&#xff0c;隐私和安全问题常常被提及。在这样的环境下&#xff0c;一个有效的解决方案是使用Sock5IP。本教程将向您介绍Sock5IP的使用方法&#xff0c;帮助您保护个人隐私并提升网络安全。 一、什么是Sock5IP&#xff1…

Mybatis-Plus使用入门

Mybatis-Plus 一、Mybatis-plus的简介 官方文档的地址&#xff1a; MyBatis-Plus &#xff08;一&#xff09;什么是Mybatis-Plus Mybatis-Plus是一个Mybatis&#xff08;opens new window&#xff09;的增强工具&#xff0c;在Mybatis的基础上只做增强不做改变&#xff0c…