Given a binary tree with the following rules:
root.val == 0
- If
treeNode.val == x
andtreeNode.left != null
, thentreeNode.left.val == 2 * x + 1
- If
treeNode.val == x
andtreeNode.right != null
, thentreeNode.right.val == 2 * x + 2
Now the binary tree is contaminated, which means all treeNode.val
have been changed to -1
.
Implement the FindElements
class:
FindElements(TreeNode* root)
Initializes the object with a contaminated binary tree and recovers it.bool find(int target)
Returnstrue
if thetarget
value exists in the recovered binary tree.
Example 1:
Input ["FindElements","find","find"] [[[-1,null,-1]],[1],[2]] Output [null,false,true] Explanation FindElements findElements = new FindElements([-1,null,-1]); findElements.find(1); // return False findElements.find(2); // return True
Example 2:
Input ["FindElements","find","find","find"] [[[-1,-1,-1,-1,-1]],[1],[3],[5]] Output [null,true,true,false] Explanation FindElements findElements = new FindElements([-1,-1,-1,-1,-1]); findElements.find(1); // return True findElements.find(3); // return True findElements.find(5); // return False
Example 3:
Input ["FindElements","find","find","find","find"] [[[-1,null,-1,-1,null,-1]],[2],[3],[4],[5]] Output [null,true,false,false,true] Explanation 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
Constraints:
TreeNode.val == -1
- The height of the binary tree is less than or equal to
20
- The total number of nodes is between
[1, 10^4]
- Total calls of
find()
is between[1, 10^4]
0 <= target <= 10^6
题目链接:https://leetcode.com/problems/find-elements-in-a-contaminated-binary-tree/
题目大意:给一颗树,初始值均为-1,按照root为0,左端点值为root*2+1,右端点值为root*2+2构造,还需要支持查询操作,判断某个数字是否在树中
题目分析:构造直接递归赋值即可,类似线段树,判断可以直接用set,但这样用不到之前构造树时的性质,若能构造出当前数字,则此数字按奇数减1除2,偶数减2除2最终必然可以恢复成0,将操作进行记录并从树根逆向遍历,若到某一步节点为空则说明该数字不存在
26ms,时间击败74.8%
/**
* 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 {
void build(TreeNode root, int val) {
if (root == null) {
return;
}
root.val = val;
if (root.left != null) {
build(root.left, val * 2 + 1);
}
if (root.right != null) {
build(root.right, val * 2 + 2);
}
}
TreeNode root;
public FindElements(TreeNode root) {
this.root = root;
build(root, 0);
}
public boolean find(int target) {
boolean[] dir = new boolean[21];
int cnt = 0;
while (target != 0) {
if (target % 2 != 0) {
target = (target - 1) >> 1;
dir[cnt++] = false;
} else {
target = (target - 2) >> 1;
dir[cnt++] = true;
}
}
TreeNode cur = this.root;
for (int i = cnt - 1; i >= 0 && cur != null; i--) {
cur = !dir[i] ? cur.left : cur.right;
}
return cur != null;
}
}
/**
* Your FindElements object will be instantiated and called as such:
* FindElements obj = new FindElements(root);
* boolean param_1 = obj.find(target);
*/