给出一个满足下述规则的二叉树:
- 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是否存在于还原后的二叉树中并返回结果。
示例 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
问题简要描述:还原二叉树并实现 FindElements 类 
Java
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class FindElements {Set<Integer> set = new HashSet<>();public FindElements(TreeNode root) {root.val = 0;dfs(root);}public boolean find(int target) {return set.contains(target);}void dfs(TreeNode root) {set.add(root.val);if (root.left != null) {root.left.val = 2 * root.val + 1;dfs(root.left);}if (root.right != null) {root.right.val = 2 * root.val + 2;dfs(root.right);}}
}/*** Your FindElements object will be instantiated and called as such:* FindElements obj = new FindElements(root);* boolean param_1 = obj.find(target);*/Python3
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class FindElements:def __init__(self, root: Optional[TreeNode]):def dfs(root: Optional[TreeNode]):self.s.add(root.val)if root.left:root.left.val = root.val * 2 + 1dfs(root.left)if root.right:root.right.val = root.val * 2 + 2dfs(root.right)self.s = set()root.val = 0dfs(root)def find(self, target: int) -> bool:return target in self.s        # Your FindElements object will be instantiated and called as such:
# obj = FindElements(root)
# param_1 = obj.find(target)TypeScript
/*** Definition for a binary tree node.* class TreeNode {*     val: number*     left: TreeNode | null*     right: TreeNode | null*     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {*         this.val = (val===undefined ? 0 : val)*         this.left = (left===undefined ? null : left)*         this.right = (right===undefined ? null : right)*     }* }*/class FindElements {private s = new Set();constructor(root: TreeNode | null) {const dfs = (root: TreeNode | null) => {this.s.add(root.val)if (root.left != null) {root.left.val = root.val * 2 + 1;dfs(root.left);}if (root.right != null) {root.right.val = root.val * 2 + 2;dfs(root.right);}}root.val = 0;dfs(root);        }find(target: number): boolean {return this.s.has(target);    }
}/*** Your FindElements object will be instantiated and called as such:* var obj = new FindElements(root)* var param_1 = obj.find(target)*/