题目来源
题目概述
给出一个满足下述规则的二叉树:
- 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
现在这个二叉树受到「污染」,所有的 treeNode.val 都变成了 -1。
请你先还原二叉树,然后实现 FindElements 类:
- FindElements(TreeNode* root) 用受污染的二叉树初始化对象,你需要先把它还原。
- bool find(int target) 判断目标值 target 是否存在于还原后的二叉树中并返回结果。
思路分析
在构造器中可以使用树的各种遍历方式把树中原本有的元素加入到表中(可以是数组,列表,哈希表)。 在find函数中只需要判断目标元素是否在表中即可。
代码实现
java实现
public class FindElements {
private Set<Integer> set = new HashSet<>();
public FindElements(TreeNode root) {
// 通过层序遍历方式转为哈希表
if (root == null) {
return;
}
root.val = 0;
Queue<TreeNode> parentQueue = new LinkedList<>();
parentQueue.add(root);
Queue<TreeNode> childrenQueue = new LinkedList<>();
while (!parentQueue.isEmpty()) {
while (!parentQueue.isEmpty()) {
TreeNode current = parentQueue.poll();
this.set.add(current.val);
if (current.left != null) {
if (current.left.val == -1) {
current.left.val = current.val * 2 + 1;
}
childrenQueue.add(current.left);
}
if (current.right != null) {
if (current.right.val == -1) {
current.right.val = (current.val + 1) * 2;
}
childrenQueue.add(current.right);
}
}
Queue<TreeNode> temp = parentQueue;
parentQueue = childrenQueue;
childrenQueue = temp;
}
}
public boolean find(int target) {
return set.contains(target);
}
}
c++实现
class FindElements {
public:
unordered_set<int> set;
FindElements(TreeNode* root) {
// 通过深度遍历方式(先序遍历)方式转为表
dfs(root, 0);
}
void dfs(TreeNode* node, int val) {
set.insert(val);
if(node -> left != nullptr){
dfs(node->left, val * 2 + 1);
}
if (node->right != nullptr) {
dfs(node->right, (val + 1) * 2);
}
}
bool find(int target) {
return set.find(target) != set.end();
}
};