首页 > 其他分享 >LeetCode[题解] 1261. 在受污染的二叉树中查找元素

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

时间:2024-03-12 21:23:07浏览次数:30  
标签:FindElements treeNode val 题解 1261 findElements 二叉树 null find

首先我们看原题

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

  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);
    }
}

 

标签:FindElements,treeNode,val,题解,1261,findElements,二叉树,null,find
From: https://www.cnblogs.com/dream-it-possible/p/18069309

相关文章

  • 题解:AT_abc194_d [ABC194D] Journey
    题意简述有一张\(n\)个节点的无边图,图在连通之前每次随机抽取一个点然后建边,求期望操作次数(即最大多少次)。思路这道题似乎和图论没什么关系,首先我们看\(n\)个球抽出一个的概率是\(\frac{1}{n}\),那么抽第二个时概率是\(\frac{1}{n-1}\)以此类推。所以最坏情况下就是抽第......
  • 力扣hot100题解(python版69-73题)
    69、有效的括号给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。示例1:输入:s="()"输出:true示例2:输入:s="()[......
  • 【解题报告】THOI2023核心素养一题解
    THOI核心素养一题解展开目录目录THOI核心素养一题解比赛结果:A沙粒的记忆B远星的守望C国王的诞生E坏齿的舞曲F山麓的回音EXTRA群星的闪耀比赛页面(题目已公开,邀请码:yspm)赛时公告板看得出来出了相当多锅(由于D出锅严重,现已撤下,比赛延长10min.还请各位海涵(为什么延长......
  • 【计算机网络01】网卡——链接5G热点网速较慢问题解决方法。
    计算机网络:网卡一、网卡带宽查询二、高速带宽设置一.在电脑连接手机热点的时候,查询网络属性,找到网络频带是2.4GHz,带宽是72(Mbps):查找原因,发现是手机热点页面中AP频带设置的原因,AP频带设置成了2.4GHz:二.更改手机热点页面中AP频带,将AP频带设置成了5GHz频段:再在电......
  • 代随想录 第十八天 | ● 513.找树左下角的值 ● 112. 路径总和 113.路径总和ii ● 10
    leetcode:513.找树左下角的值-力扣(LeetCode)思路:是找最深左下角的值,不是找左节点最深的值!!遍历深度,判断最大深度,存储后再与下一个相同深度的比较,先左后右,也就是从左到右的顺序来判断的,所以能找到树下左下角的值classSolution{intmaxdepth=0;intresult=0;......
  • Dwango Programming Contest 6th D 题解
    正好测试一下专栏的题解系统。我省选寄了都怪洛谷/fn/fn/fn/fn/fn/fn/fn题解显然可以对于所有关系建有向边,显然是基环外向树森林。由于是字典序最小,因此找到最小的上一个点没有直接连向边的点一定最优。但是有时取最优会导致最后无法选完,我们考虑无法选完的情况。第一种是......
  • AtCoder Beginner Contest 344 A-G 题解
    AtCoderBeginnerContest344A-SpoilerQuestion删除两个|之间的字符Solution按照题意模拟即可Code#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;cin>>s;stringp1,p2;for(inti=0;i<s.size();i++){......
  • leetcode: 1261: 在受污染的二叉树中查找元素
    给出一个满足下述规则的二叉树: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现在这个二叉树受到「污染」,所有的 tree......
  • 第五节:二叉树相关(反转二叉树[递归/栈]、最大路径和)
    一.反转二叉树一.题目描述  给你一棵二叉树的根节点root,反转这棵二叉树,并返回其根节点。  示例:  leetcode:https://leetcode.cn/problems/invert-binary-tree/description/  难度:【简单】二.思路分析1-递归 1.首先要有递归结束的条件 2.先写......
  • LeetCode - 高频SQL50题(基础版)部分题解(上)
    1581.进店却未进行过交易的顾客原题:https://leetcode.cn/problems/customer-who-visited-but-did-not-make-any-transactions/题意:有一些顾客可能光顾了购物中心但没有进行交易。请你编写一个解决方案,来查找这些顾客的ID(customer_id),以及他们只光顾不交易的次数(count_no_trans......