二叉树题目:在受污染的二叉树中查找元素

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 前言
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:在受污染的二叉树中查找元素

出处:1261. 在受污染的二叉树中查找元素

难度

5 级

题目描述

要求

给出一个满足下述规则的二叉树:

  1. root.val = 0 \texttt{root.val} = \texttt{0} root.val=0
  2. 如果 treeNode.val = x \texttt{treeNode.val} = \texttt{x} treeNode.val=x treeNode.left ≠ null \texttt{treeNode.left} \ne \texttt{null} treeNode.left=null,那么 treeNode.left.val = 2 × x + 1 \texttt{treeNode.left.val} = \texttt{2} \times \texttt{x} + \texttt{1} treeNode.left.val=2×x+1
  3. 如果 treeNode.val = x \texttt{treeNode.val} = \texttt{x} treeNode.val=x treeNode.right ≠ null \texttt{treeNode.right} \ne \texttt{null} treeNode.right=null,那么 treeNode.right.val = 2 × x + 2 \texttt{treeNode.right.val} = \texttt{2} \times \texttt{x} + \texttt{2} treeNode.right.val=2×x+2

现在这个二叉树受到污染,所有的 treeNode.val \texttt{treeNode.val} treeNode.val 都变成了 -1 \texttt{-1} -1

实现 FindElements \texttt{FindElements} FindElements 类:

  • FindElements(TreeNode* root) \texttt{FindElements(TreeNode* root)} FindElements(TreeNode* root) 用受污染的二叉树初始化对象,并将二叉树还原。
  • bool find(int target) \texttt{bool find(int target)} bool find(int target) 判断目标值 target \texttt{target} target 是否存在于还原后的二叉树中,如果存在则返回 true \texttt{true} true

示例

示例 1:

示例 1

输入:
["FindElements","find","find"] \texttt{["FindElements","find","find"]} ["FindElements","find","find"]
[[[-1,null,-1]],[1],[2]] \texttt{[[[-1,null,-1]],[1],[2]]} [[[-1,null,-1]],[1],[2]]
输出:
[null,false,true] \texttt{[null,false,true]} [null,false,true]
解释:
FindElements findElements = new FindElements([-1,null,-1]); \texttt{FindElements findElements = new FindElements([-1,null,-1]);} FindElements findElements = new FindElements([-1,null,-1]);
findElements.find(1); \texttt{findElements.find(1);} findElements.find(1); // 返回 False \texttt{False} False
findElements.find(2); \texttt{findElements.find(2);} findElements.find(2); // 返回 True \texttt{True} True

示例 2:

示例 2

输入:
["FindElements","find","find","find"] \texttt{["FindElements","find","find","find"]} ["FindElements","find","find","find"]
[[[-1,-1,-1,-1,-1]],[1],[3],[5]] \texttt{[[[-1,-1,-1,-1,-1]],[1],[3],[5]]} [[[-1,-1,-1,-1,-1]],[1],[3],[5]]
输出:
[null,true,true,false] \texttt{[null,true,true,false]} [null,true,true,false]
解释:
FindElements findElements = new FindElements([-1,-1,-1,-1,-1]); \texttt{FindElements findElements = new FindElements([-1,-1,-1,-1,-1]);} FindElements findElements = new FindElements([-1,-1,-1,-1,-1]);
findElements.find(1); \texttt{findElements.find(1);} findElements.find(1); // 返回 True \texttt{True} True
findElements.find(3); \texttt{findElements.find(3);} findElements.find(3); // 返回 True \texttt{True} True
findElements.find(5); \texttt{findElements.find(5);} findElements.find(5); // 返回 False \texttt{False} False

示例 3:

示例 3

输入:
["FindElements","find","find","find","find"] \texttt{["FindElements","find","find","find","find"]} ["FindElements","find","find","find","find"]
[[[-1,null,-1,-1,null,-1]],[2],[3],[4],[5]] \texttt{[[[-1,null,-1,-1,null,-1]],[2],[3],[4],[5]]} [[[-1,null,-1,-1,null,-1]],[2],[3],[4],[5]]
输出:
[null,true,false,false,true] \texttt{[null,true,false,false,true]} [null,true,false,false,true]
解释:
FindElements findElements = new FindElements([-1,null,-1,-1,null,-1]); \texttt{FindElements findElements = new FindElements([-1,null,-1,-1,null,-1]);} FindElements findElements = new FindElements([-1,null,-1,-1,null,-1]);
findElements.find(2); \texttt{findElements.find(2);} findElements.find(2); // 返回 True \texttt{True} True
findElements.find(3); \texttt{findElements.find(3);} findElements.find(3); // 返回 False \texttt{False} False
findElements.find(4); \texttt{findElements.find(4);} findElements.find(4); // 返回 False \texttt{False} False
findElements.find(5); \texttt{findElements.find(5);} findElements.find(5); // 返回 True \texttt{True} True

数据范围

  • TreeNode.val = -1 \texttt{TreeNode.val} = \texttt{-1} TreeNode.val=-1
  • 二叉树的高度不超过 20 \texttt{20} 20
  • 树中结点数目在范围 [1, 10 4 ] \texttt{[1, 10}^\texttt{4}\texttt{]} [1, 104]
  • 调用 find() \texttt{find()} find() 的总次数在范围 [1, 10 4 ] \texttt{[1, 10}^\texttt{4}\texttt{]} [1, 104]
  • 0 ≤ target ≤ 10 6 \texttt{0} \le \texttt{target} \le \texttt{10}^\texttt{6} 0target106

前言

这道题给定受污染的二叉树,要求还原二叉树然后判断每个元素是否在还原后的二叉树中。

还原二叉树可以通过遍历二叉树实现。根结点值还原成 0 0 0,对于每个已经还原的结点,如果结点值是 x x x,则当其左子结点不为空时将左子结点值设为 2 × x + 1 2 \times x + 1 2×x+1,当其右子结点不为空时将右子结点值设为 2 × x + 2 2 \times x + 2 2×x+2

还原二叉树之后,查找元素的最直观做法是假设还原后的二叉树中存在目标值结点,找到从根结点到目标值结点的路径。为了找到路径,从目标值结点开始每次寻找当前结点的父结点,直到定位到父结点。找到路径之后,从父结点出发向目标值结点移动,判断路径上的结点是否都存在,如果都存在则目标值在还原后的二叉树中,否则目标值不在还原后的二叉树中。

使用上述做法查找元素,每次查找的时间复杂度和二叉树的高度有关。时间复杂度更低的做法是用哈希集合存储结点值,在构造方法中遍历并还原二叉树,同时将还原后的二叉树中的每个结点值存入哈希集合中,在查找元素时只需要判断目标值是否在哈希集合中即可。

解法一

思路和算法

可以使用深度优先搜索遍历并还原二叉树。

构造方法中,将根结点值设为 0 0 0,从根结点开始遍历,遍历操作如下。

  1. value \textit{value} value 表示当前结点值,将 value \textit{value} value 加入哈希集合。

  2. 如果当前结点的左子结点不为空,则将左子结点值设为 2 × value + 1 2 \times \textit{value} + 1 2×value+1,然后遍历左子树。

  3. 如果当前结点的右子结点不为空,则将右子结点值设为 2 × value + 2 2 \times \textit{value} + 2 2×value+2,然后遍历右子树。

查找元素时,判断目标值是否在哈希集合中。

代码

class FindElements {Set<Integer> values;public FindElements(TreeNode root) {values = new HashSet<Integer>();root.val = 0;dfs(root);}public boolean find(int target) {return values.contains(target);}private void dfs(TreeNode node) {int value = node.val;values.add(value);TreeNode left = node.left, right = node.right;if (left != null) {left.val = 2 * value + 1;dfs(left);}if (right != null) {right.val = 2 * value + 2;dfs(right);}}
}

复杂度分析

  • 时间复杂度:构造方法的时间复杂度是 O ( n ) O(n) O(n),查找操作的时间复杂度是 O ( 1 ) O(1) O(1),其中 n n n 是二叉树的结点数。构造方法需要遍历每个结点一次并将每个结点值加入哈希集合,需要 O ( n ) O(n) O(n) 的时间。查找操作判断目标值是否在哈希集合中,需要 O ( 1 ) O(1) O(1) 的时间。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。需要使用哈希集合存储还原后的二叉树中的每个结点值。

解法二

思路和算法

也可以使用广度优先搜索遍历并还原二叉树。

构造方法中,将根结点值设为 0 0 0,然后从根结点开始遍历。使用队列存储待访问的结点,初始时将根结点入队列。每次将一个结点出队列,执行如下操作,直到队列为空时遍历结束。

  1. value \textit{value} value 表示当前结点值,将 value \textit{value} value 加入哈希集合。

  2. 如果当前结点的左子结点不为空,则将左子结点值设为 2 × value + 1 2 \times \textit{value} + 1 2×value+1,然后将左子结点入队列。

  3. 如果当前结点的右子结点不为空,则将右子结点值设为 2 × value + 2 2 \times \textit{value} + 2 2×value+2,然后将右子结点入队列。

查找元素时,判断目标值是否在哈希集合中。

代码

class FindElements {Set<Integer> values;public FindElements(TreeNode root) {values = new HashSet<Integer>();root.val = 0;Queue<TreeNode> queue = new ArrayDeque<TreeNode>();queue.offer(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();int value = node.val;values.add(value);TreeNode left = node.left, right = node.right;if (left != null) {left.val = 2 * value + 1;queue.offer(left);}if (right != null) {right.val = 2 * value + 2;queue.offer(right);}}}public boolean find(int target) {return values.contains(target);}
}

复杂度分析

  • 时间复杂度:构造方法的时间复杂度是 O ( n ) O(n) O(n),查找操作的时间复杂度是 O ( 1 ) O(1) O(1),其中 n n n 是二叉树的结点数。构造方法需要遍历每个结点一次并将每个结点值加入哈希集合,需要 O ( n ) O(n) O(n) 的时间。查找操作判断目标值是否在哈希集合中,需要 O ( 1 ) O(1) O(1) 的时间。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。需要使用哈希集合存储还原后的二叉树中的每个结点值。

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

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

相关文章

脱碱软化树脂Tulsimer CXO-5 MP 高盐水除钙镁树脂

一、产品介绍 Tulsimer CXO-5 MP 是一款大孔弱酸性丙烯酸系阳离子交换树脂&#xff0c;能除去水中的碱度和硬度&#xff0c;特别是除去水中的碳酸氢盐、碳酸盐及其它碱性盐类&#xff0c;适合运用于纯水 ,脱碱软化及选择性的去除重金属。适合在宽广的 pH 及温度范围情况下操作…

深入理解软件测试中的Web请求流程!

在软件开发的过程中&#xff0c;软件测试是不可或缺的一环&#xff0c;它有助于确保软件系统的稳定性、可靠性和安全性。而在众多测试中&#xff0c;Web请求流程的测试显得尤为重要&#xff0c;因为几乎所有的现代应用都离不开网络交互。接下来我们将深入探讨软件测试中完整的W…

【带头学C++】----- 九、类和对象 ---- 9.10 C++设计模式之单例模式设计

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️麻烦您点个关注&#xff0c;不迷路❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ 目 录 9.10 C设计模式之单例模式设计 举例说明&#xff1a; 9.10 C设计模式之单例模式设计 看过我之前的文章的&#xff0c;简单讲解过C/Q…

<Linux> 进程

目录 一、进程概念 什么是task_struck task_struct包含内容 二、查看进程 1. ps 查看&#xff1a; 2. /proc/目录查看 3. top 指令 三、系统调用获取进程标示符 获取自己、父进程ID 四、创建进程 1. 初识fork 2. 理解fork创建子进程 3. fork后的数据修改 4.for…

直流电和交流电

直流电&#xff08;Direct Current&#xff0c;简称DC&#xff09;和交流电&#xff08;Alternating Current&#xff0c;简称AC&#xff09;是电流的两种基本形式。 1. 直流电 直流电是指电流方向始终保持不变的电流。在直流电中&#xff0c;电子只能沿着一个方向移动。直流电…

网络攻击(二)--情报搜集阶段

4.1. 概述 在情报收集阶段&#xff0c;你需要采用各种可能的方法来收集将要攻击的客户组织的所有信息&#xff0c;包括使用社交网络、Google Hacking技术、目标系统踩点等等。 而作为渗透测试者&#xff0c;你最为重要的一项技能就是对目标系统的探查能力&#xff0c;包括获知…

windows MYSQL下载和自定路径安装,以及解决中文乱码问题。

文章讲的很详细&#xff0c;请耐心往下看。 一、mysql下载 下载网址&#xff1a;https://www.mysql.com/downloads/ 表示不登录&#xff0c;直接下载。 以上就把安装包下载完了。下载是8.0.35版本。 二、接下来看怎么安装 1.双击安装包&#xff0c;进行安装。 注意&#x…

15:00面试,15:06就出来了,问的问题太变态了。。

刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到5月一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资还要降…

白羽肉鸡养殖市场分析:2023年中国市场处于盈利状态

白羽肉鸡是我国养殖的主要快大型肉鸡品种&#xff0c;由于羽毛为白色&#xff0c;相较于本土黄羽肉鸡的羽毛颜色&#xff0c;基层常称其为白羽肉鸡。 隐性白羽鸡属于快大白羽肉鸡。是从白洛克(或白温多得)中选育而成。原产于法国。隐性白羽鸡在优质鸡配套上的应用对我国优质鸡产…

【高数:3 无穷小与无穷大】

【高数&#xff1a;3 无穷小与无穷大】 1 无穷小与无穷大2 极限运算法则3 极限存在原则4 趋于无穷小的比较 参考书籍&#xff1a;毕文斌, 毛悦悦. Python漫游数学王国[M]. 北京&#xff1a;清华大学出版社&#xff0c;2022. 1 无穷小与无穷大 无穷大在sympy中用两个字母o表示无…

k8s volumes and data

Overview 传统上&#xff0c;容器引擎(Container Engine)不提供比容器寿命更长的存储。由于容器被认为是瞬态(transient)的&#xff0c;这可能会导致数据丢失或复杂的外部存储选项。Kubernetes卷共享 Pod 生命周期&#xff0c;而不是其中的容器。如果容器终止&#xff0c;数据…

C# 数据的保存和提取(.TXT格式)

红色部分的才是最终版 一、将页面内容保存到文件中 第一步 创建Visual的Windows窗体应用,使用的是 第二步 创建几个Label控件、TextBox控件、以及Button按钮,而TextBox控件放入Panel中 第三步 先对写法进行了解,了解保存的语句 StreamWriter sw= new StreamWriter(TXT…

【android开发-17】android中SQLite数据库CRUD详细介绍

1&#xff0c;SQLite数据库读写的操作步骤 在Android中&#xff0c;对SQLite数据库的操作主要包括以下步骤&#xff1a; 1&#xff0c;创建数据库&#xff1a;首先&#xff0c;您需要创建一个SQLite数据库。这可以通过在Android项目中创建一个新的类来实现&#xff0c;该类继…

专业课145+总分440+东南大学920考研专业基础综合信号与系统数字电路经验分享

个人情况简介 今年考研440&#xff0c;专业课145&#xff0c;数一140&#xff0c;期间一年努力辛苦付出&#xff0c;就不多表了&#xff0c;考研之路虽然艰难&#xff0c;付出很多&#xff0c;当收获的时候&#xff0c;都是值得&#xff0c;考研还是非常公平&#xff0c;希望大…

Qt开发 之 记一次安装 Qt5.12.12 安卓环境的失败案例

文章目录 1、安装Qt2、安卓开发的组合套件2.1、CSDN地址2.2、官网地址2.3、发现老方法不适用了 3、尝试用新方法解决3.1、先安装JDK&#xff0c;搞定JDK环境变量3.1.1、安装jdk3.1.2、确定jdk安装路径3.1.3、打开系统环境变量配置3.1.4、配置系统环境变量3.1.5、验证JDK环境变量…

ERPNext SQL 注入漏洞复现

0x01 产品简介 ERPNext 是一套开源的企业资源计划系统。 0x02 漏洞概述 ERPNext 系统frappe.model.db_query.get_list 文件 filters 参数存在 SQL 注入漏洞,攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权…

100:ReconFusion: 3D Reconstruction with Diffusion Priors

简介 官网 少样本重建必然导致nerf失败&#xff0c;论文提出使用diffusion模型来解决这一问题。从上图不难看出&#xff0c;论文一步步提升视角数量&#xff0c;逐步与Zip-NeRF对比。 实现流程 Diffusion Model for Novel View Synthesis 给定一组输入图像 x o b s { x i…

EMNLP 2023 获奖论文公布,大模型、NLP等领域火爆

EMNLP是计算语言学和自然语言处理领域顶级国际会议之一&#xff0c;属于CCF B类&#xff0c;是由 ACL 下属的SIGDAT小组主办的NLP领域顶级国际会议&#xff0c;一年举办一次。相较于ACL&#xff0c;EMNLP更偏向于NLP在各个领域解决方案的学术探讨。 今年的EMNLP 2023 已于2023…

Excel COUNT类函数使用

目录 一. COUNT二. COUNTA三. COUNTBLANK四. COUNTIF五. COUNTIFS 一. COUNT ⏹用于计算指定范围内包含数字的单元格数量。 基本语法 COUNT(value1, [value2], ...)✅统计A2到A7所有数字单元格的数量 ✅统计A2到A7&#xff0c;B2到B7的所有数字单元格的数量 二. COUNTA ⏹计…

Unity中Shader黑白阀值后处理效果

文章目录 前言一、我们先来PS看一下黑白阀值的效果二、使用step(a,b)函数实现效果三、实现脚本控制黑白阀值1、在Shader属性面板定义控制阀值变量2、把step的a改为_Value3、在后处理脚本设置公共成员变量,并且设置范围为&#xff08;0&#xff0c;1&#xff09;4、在Graphics.B…