-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy path1261.FindElementsinaContaminatedBinaryTree.py
114 lines (100 loc) · 3.68 KB
/
1261.FindElementsinaContaminatedBinaryTree.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
'''
Given a binary tree with the following rules:
1. root.val == 0
2. If treeNode.val == x and treeNode.left != null, then
treeNode.left.val == 2 * x + 1
3. 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.
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 the target value exists
in the recovered binary tree.
Example:
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:
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:
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
'''
#Difficulty: Medium
#30 / 30 test cases passed.
#Runtime: 88 ms
#Memory Usage: 20.7 MB
#Runtime: 88 ms, faster than 56.65% of Python3 online submissions for Find Elements in a Contaminated Binary Tree.
#Memory Usage: 20.7 MB, less than 5.65% of Python3 online submissions for Find Elements in a Contaminated Binary Tree.
# 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: TreeNode):
self.vals = {0}
self.root = root
self.recover(self.root)
def find(self, target: int) -> bool:
return target in self.vals
def recover(self, root: TreeNode):
stack = []
root.val = 0
curr = root
while True:
if curr:
stack.append(curr)
if curr.left:
curr.left.val = curr.val * 2 + 1
self.vals.add(curr.left.val)
curr = curr.left
elif stack:
curr = stack.pop()
if curr.right:
curr.right.val = curr.val * 2 + 2
self.vals.add(curr.right.val)
curr = curr.right
else:
break
# Your FindElements object will be instantiated and called as such:
# obj = FindElements(root)
# param_1 = obj.find(target)