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

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

首先我们看原题

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

  1. root.val == 0
  2. 如果 treeNode.val == xtreeNode.left != null,那么 treeNode.left.val == 2 * x + 1
  3. 如果 treeNode.val == xtreeNode.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 == xtreeNode.left != null,那么 treeNode.left.val == 2 * x + 1

- 如果 treeNode.val == xtreeNode.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);
    }
}

 

目录
相关文章
|
6月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
66 1
|
22天前
|
机器学习/深度学习 存储 算法
【LeetCode 热题100】347:前 K 个高频元素(详细解析)(Go语言版)
这篇文章详细解析了力扣热题 347——前 K 个高频元素的三种解法:哈希表+小顶堆、哈希表+快速排序和哈希表+桶排序。每种方法都附有清晰的思路讲解和 Go 语言代码实现。小顶堆方法时间复杂度为 O(n log k),适合处理大规模数据;快速排序方法时间复杂度为 O(n log n),适用于数据量较小的场景;桶排序方法在特定条件下能达到线性时间复杂度 O(n)。文章通过对比分析,帮助读者根据实际需求选择最优解法,并提供了完整的代码示例,是一篇非常实用的算法学习资料。
173 90
|
4天前
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
26 4
|
10天前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
87 10
|
10天前
|
算法 Go
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
42 9
|
10天前
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
67 9
|
6月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
51 0
|
6月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
42 0
|
6月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
47 0
|
6月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
53 0

热门文章

最新文章