This article has participated in the “Digitalstar Project” and won a creative gift package to challenge the creative incentive money.
describe
Given a binary tree with the following rules:
- root.val == 0
- If treeNode.val == x and treeNode.left ! = null, then treeNode.left.val == 2 * x + 1
- If treeNode.val == x and treeNode.right ! = null, then treeNode.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) Returns true if the target 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
Copy the code
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
Copy the code
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
Copy the code
Note:
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
Copy the code
parsing
The root node is 0, the value of the left node is two times the value of its parent, and the value of the right node is two times the value of its parent. We need to use __init__ to restore the tree, and then use find to determine if target is in the tree.
The idea is relatively simple, is to use recursion to directly calculate the value of the tree node in a list, and then determine whether target is in the list. The problem looks complicated, but actually it’s quite simple.
answer
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class FindElements(object):
def __init__(self, root):
"""
:type root: TreeNode
"""
self.vals = []
def dfs(root, val):
if not root:
return
self.vals.append(val)
if root.left:
dfs(root.left, val*2+1)
if root.right:
dfs(root.right, val*2+2)
dfs(root, 0)
def find(self, target):
"""
:type target: int
:rtype: bool
"""
if target in self.vals:
return True
return False
Copy the code
The results
Runtime: 201 ms, faster than 6.67% of Python online submissions for Find Elements ina Contaminated Binary Tree. Memory Usage: 19.2 MB, less than 76.67% of Python online submissions for Find Elements ina Contaminated Binary Tree.Copy the code
parsing
You can also use queues to solve this problem. The tree building process is similar to the above and will not be described in detail.
answer
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class FindElements(object):
def __init__(self, root):
self.A = set()
queue = collections.deque([[root,0]])
while queue:
n,x = queue.popleft()
self.A.add(x)
if n.left:
queue.append( [n.left , 2*x+1] )
if n.right:
queue.append( [n.right , 2*x+2] )
def find(self, target):
return target in self.A
Copy the code
The results
Runtime: 136 ms, faster than 33.33% of Python online submissions for finding Elements ina Contaminated Binary Tree. Memory Usage: 19.7 MB, less than 13.33% of Python online submissions for Find Elements ina Contaminated Binary Tree.Copy the code
Original link: leetcode.com/problems/fi…
Your support is my biggest motivation