Find Elements in a Contaminated Binary Tree
Description
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
.
You need to first recover the binary tree and then implement the FindElements
class:
FindElements(TreeNode* root)
Initializes the object with a contamined binary tree, you need to recover it first.bool find(int target)
Return 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
Solution(javascript)
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
*/
const FindElements = function (root) {
root.val = 0
const aux = (node, prev) => {
if (node) {
if (node === prev.left) {
node.val = 2 * prev.val + 1
} else if (node === prev.right) {
node.val = 2 * prev.val + 2
}
aux(node.left, node)
aux(node.right, node)
}
}
aux(root, root)
this.root = root
}
/**
* @param {number} target
* @return {boolean}
*/
// O(h) time and space
FindElements.prototype.find = function (target) {
const result = []
while (target >= 0) {
result.push(target)
target = Math.floor((target - 1) / 2)
}
const index = result.length - 1
if (this.root.val !== result[index]) {
return false
}
const aux = (parent, index) => {
if (index < 0) {
return true
}
if (!parent) {
return false
}
if (parent.left && parent.left.val === result[index]) {
return aux(parent.left, index - 1)
}
if (parent.right && parent.right.val === result[index]) {
return aux(parent.right, index - 1)
}
return false
}
return aux(this.root, index - 1)
}