LeetCode[题解] 1261. 在受污染的二叉树中查找元素

news/发布时间2024/5/16 20:16:11

首先我们看原题

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

  1. root.val == 0
  2. 如果 treeNode.val == x 且 treeNode.left != null,那么 treeNode.left.val == 2 * x + 1
  3. 如果 treeNode.val == x 且 treeNode.right != null,那么 treeNode.right.val == 2 * x + 2

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

请你先还原二叉树,然后实现 FindElements 类:

  • FindElements(TreeNode* root) 用受污染的二叉树初始化对象,你需要先把它还原。
  • bool find(int target) 判断目标值 target 是否存在于还原后的二叉树中并返回结果。

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

  • TreeNode.val == -1
  • 二叉树的高度不超过 20
  • 节点的总数在 [1, 10^4] 之间
  • 调用 find() 的总次数在 [1, 10^4] 之间
  • 0 <= target <= 10^6

 

题解:

通过题目描述,我们知道我们首先要将树的原貌恢复出来;

1. 那怎么恢复树的原貌呢?

根据受污染的树的结构,我们可以知道树的结构(形状);然后我们根据题目的说明,原先的树是满足如下条件的:

 

- ​​root.val == 0​

- 如果 ​​treeNode.val == x​​​ 且 ​​treeNode.left != null​​​,那么 ​​treeNode.left.val == 2 * x + 1​

- 如果 ​​treeNode.val == x​​​ 且 ​​treeNode.right != null​​​,那么 ​​treeNode.right.val == 2 * x + 2​

 

知道这个规则之后,我们就可以计算出该树上每个节点原始值为多少。

 

2. 知道的树的结构以及每个节点的原始值,那具体怎么将受污染的树的节点值填充回原来的值的呢?

很简单,我们只需要从头节点开始遍历树,然后再遍历的过程中恢复每个节点的原始值并且记录下来。遍历树的方式有好几种,可以使用深度优先或者广度优先等算法遍历;如下是使用深度优先遍历算法实现的遍历树的一个方法:

public void traversalTree(TreeNode curPoint, int value) {valueSet.add(value);if (Objects.nonNull(curPoint.left)) {traversalTree(curPoint.left, value * 2 + 1);}if (Objects.nonNull(curPoint.right)) {traversalTree(curPoint.right, value * 2 + 2);}}

如上,我们在遍历的时候同时记录下每个节点值到​​valueSet​​​,然后最终要判断一个值,是否在该树的一个节点上,只需要判断该值是否在​​valueSet​​中,即可。

 

最终代码题解

class FindElements {HashSet<Integer> valueSet;public FindElements(TreeNode root) {valueSet = new HashSet<>();traversalTree(root, 0);}public void traversalTree(TreeNode curPoint, int value) {valueSet.add(value);if (Objects.nonNull(curPoint.left)) {traversalTree(curPoint.left, value * 2 + 1);}if (Objects.nonNull(curPoint.right)) {traversalTree(curPoint.right, value * 2 + 2);}}public boolean find(int target) {return valueSet.contains(target);}
}

 

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

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

相关文章

【PR】UC-NERF: NEURAL RADIANCE FIELD FOR UNDERCALIBRATED MULTI-VIEW CAMERAS IN AUTONOMOUS DRIVING

【简介】 这篇文章的作者来自中科大、北大武汉人工智能研究院、大疆和上海科大,投稿到了ICLR 2024会议,已接收。 UC,表示under calibrated,意味着标定不准。本文提出UC-NeRF用于解决标定不够好的多相机配置的新视角合成方法。首先,作者提出一种基于层的颜色校正方法,以纠…

安装部署gitea

gitea介绍 官网 https://about.gitea.cn/ 最近发现gitea的官网发生了变化,也不知道什么时候改了,之前的域名是gitea.io的,但是现在会跳转到about.gitea.cn域名上可能是商业化了吧,但这也并不意味着 Gitea 就变成了商业软件。 Gitea 目前仍然是一个完全免费且开源的项目,任…

Vulnhub之DarkHole_1

DarkHole_1一 信息收集IP扫描端口扫描访问80目录扫描查看目录80网页 -->login 注册用户我的 id 是 2,那么应该有个账号是 id=1,尝试越权修改 id=1 的密码把id改为1发现登陆成功,多了一个上传文件的地方,前面的目录扫描中我们也发现了 /upload 路径,尝试上传反弹 sh…

R:共现网络图例绘制

# 清除所有变量 rm(list = ls()) # 设置工作目录 setwd("C:\\Users\\Administrator\\Desktop\\新建文件夹\\Co-occurrence Network\\图例") # 载入ggplot2包 library(ggplot2)# 创建一个数据框,包含您想要在图例中展示的颜色和类别 # 确保Category是按照正确的顺序设…

【运维必看】Linux命令之lsblk命令

一、命令简介 lsblk命令的英文是“list block”,即用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。块设备有硬盘,闪存盘,CD-ROM等等。lsblk命令包含util-linux中。通过yum provides lsblk命令查看命令对应的软件包。不通的版本…

图数据库基准测试 LDBC SNB 系列讲解:Schema 和数据生成的机制

作为大多数图数据库性能测试标配的 LDBC SNB 它是如何保障不同系统环境之间的测评比较公平且基准测试结果可重复的呢?本文从数据和 Schema 生成入手同你讲解它的原理。LDBC(Linked Data Benchmark Council)Social Network Benchmark,简称 LDBC SNB,是一种针对社交网络场景…