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

文章目录

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

题目

标题和出处

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

出处: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.hqwc.cn/news/266213.html

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

相关文章

12.11

1.q&#xff0c;w&#xff0c;e亮led1&#xff0c;2&#xff0c;3&#xff1b; a&#xff0c;s&#xff0c;d灭led1&#xff0c;2&#xff0c;3&#xff1b; main.c #include "uar1.h"#include "led.h"void delay(int ms){int i,j;for(i0;i<ms;i){for…

WampServer本地部署结合内网穿透实现公网访问本地服务

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…

Altair Radioss碰撞 安全与冲击 衡祖仿真

Altair Radioss是解决瞬态加载工况下非线性问题的领先的结构分析求解器。其具备高扩展性、高品质、高鲁棒性&#xff0c;以及诸多功能&#xff1a;多域求解技术、高级材料功能(复合材料)等。Radioss求解器被广泛应用于汽车、航空航天、电子/家电、包装、轨道机车、生物医疗、能…

GoEasy使用手册

GoEasy官网 登录 - GoEasy 即时通讯聊天案例 GoEasy - GoEasy (gitee.com) 注意事项 接口使用人数上限为15&#xff0c;超出之后会请求超时返回408状态码&#xff0c;可以新建一个应用用来更换common Key 创建应用 ​ 添加应用名称&#xff0c;其余默认&#xff0c;点击…

【计算机网络】UDP报文详解

目录 一. UDP协议概述 二. UDP报文格式 首部 三. UDP的缓冲区 一. UDP协议概述 UDP——用户数据报协议&#xff0c;是传输层的一个重要协议 基于UDP的应用层协议有&#xff1a;DNS&#xff0c;TFTP&#xff0c;SNMP&#xff0c;NTP 协议全称默认端口号DNSDomain Name Se…

向宇的博客免责声明

文章目录 前言起因个人叠甲关于原创讨论对大家的一些话对CSDN的话学习群参与人员最后完结 前言 大家好&#xff0c;其实这里就只是我拿来记录自己的学习笔记的&#xff0c;但是随着关注度越来越高&#xff0c;发现我不能像之前那么随意了&#xff0c;想分享什么写什么&#xf…

python期末简答题及答案,python期末题库和答案

本篇文章给大家谈谈python期末简答题及答案&#xff0c;以及python期末题库和答案&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 期末复习判断题 &#xff08; √ &#xff09;Python变量名区分大小写,所以student和Student不是同一个变量。&#xff08; &…

王道数据结构课后代码题p150 第13——17 (c语言代码实现)

目录 13.p 和 q 分别为指向该二叉树中任意两个结点的指针&#xff0c;试编写算法 ANCESTOR(ROOT,P,q,r)&#xff0c;找到P和q的最近公共祖先结点 r 14.假设二叉树采用二叉链表存储结构&#xff0c;设计一个算法&#xff0c;求非空二叉树 b的宽度(即具有结点数最多的那一层的结点…

图的遍历(深度优先遍历 + 广度优先遍历)

目录 &#x1f33c;广度优先遍历 &#xff08;1&#xff09;邻接矩阵BFS &#xff08;2&#xff09;邻接表BFS &#xff08;3&#xff09;非连通图BFS &#xff08;4&#xff09;复杂度分析 &#x1f33c;深度优先遍历 &#xff08;1&#xff09;邻接矩阵的DFS &#x…

(企业 / 公司项目) 企业项目如何使用jwt?

按照企业的项目然后写的小demo&#xff0c; 自己搞一个登录接口然后调用jwtUtil工具类 后端实现 创建一个通用模块common来实现jwt生成token 登录注册的基本实现逻辑思路 面试| ProcessOn免费在线作图,在线流程图,在线思维导图 注释挺详细的jwtUtil工具类&#xff0c; 封装的…

记录 | xshell输出错乱解决

输出错乱问题&#xff1a; 解决方法&#xff1a;

Python 学习笔记之 networkx 使用

介绍 networkx networkx 支持创建简单无向图、有向图和多重图&#xff1b;内置许多标准的图论算法&#xff0c;节点可为任意数据&#xff1b;支持任意的边值维度&#xff0c;功能丰富&#xff0c;简单易用 networkx 中的 Graph Graph 的定义 Graph 是用点和线来刻画离散事物…