@@ -89,7 +89,7 @@ findElements.find(5); // return True
89
89
90
90
### 方法一:DFS + 哈希表
91
91
92
- 我们先通过 DFS 遍历二叉树,将节点值恢复为原来的值,然后再通过哈希表存储所有节点值,这样在查找时就可以直接判断目标值是否存在于哈希表中 。
92
+ 我们先通过 DFS 遍历二叉树,将节点值恢复为原来的值,并将所有节点值存入哈希表中。然后在查找时,只需要判断哈希表中是否存在目标值即可 。
93
93
94
94
时间复杂度方面,初始化时需要遍历二叉树,时间复杂度为 $O(n)$,查找时只需要判断哈希表中是否存在目标值,时间复杂度为 $O(1)$。空间复杂度 $O(n)$。其中 $n$ 为二叉树节点个数。
95
95
@@ -103,9 +103,10 @@ findElements.find(5); // return True
103
103
# self.left = left
104
104
# self.right = right
105
105
class FindElements :
106
+
106
107
def __init__ (self , root : Optional[TreeNode]):
107
- def dfs (root ):
108
- self .vis .add(root.val)
108
+ def dfs (root : Optional[TreeNode] ):
109
+ self .s .add(root.val)
109
110
if root.left:
110
111
root.left.val = root.val * 2 + 1
111
112
dfs(root.left)
@@ -114,11 +115,11 @@ class FindElements:
114
115
dfs(root.right)
115
116
116
117
root.val = 0
117
- self .vis = set ()
118
+ self .s = set ()
118
119
dfs(root)
119
120
120
121
def find (self , target : int ) -> bool :
121
- return target in self .vis
122
+ return target in self .s
122
123
123
124
124
125
# Your FindElements object will be instantiated and called as such:
@@ -143,15 +144,19 @@ class FindElements:
143
144
* }
144
145
*/
145
146
class FindElements {
146
- private Set<Integer > vis = new HashSet<> ();
147
+ private Set<Integer > s = new HashSet<> ();
147
148
148
149
public FindElements (TreeNode root ) {
149
150
root. val = 0 ;
150
151
dfs(root);
151
152
}
152
153
154
+ public boolean find (int target ) {
155
+ return s. contains(target);
156
+ }
157
+
153
158
private void dfs (TreeNode root ) {
154
- vis . add(root. val);
159
+ s . add(root. val);
155
160
if (root. left != null ) {
156
161
root. left. val = root. val * 2 + 1 ;
157
162
dfs(root. left);
@@ -161,10 +166,6 @@ class FindElements {
161
166
dfs(root. right);
162
167
}
163
168
}
164
-
165
- public boolean find (int target ) {
166
- return vis. contains(target);
167
- }
168
169
}
169
170
170
171
/**
@@ -190,26 +191,27 @@ class FindElements {
190
191
public:
191
192
FindElements(TreeNode* root) {
192
193
root->val = 0;
193
- function<void(TreeNode* )> dfs = [ &] (TreeNode* root) {
194
- vis.insert(root->val);
195
- if (root->left) {
196
- root->left->val = root->val * 2 + 1;
197
- dfs(root->left);
198
- }
199
- if (root->right) {
200
- root->right->val = root->val * 2 + 2;
201
- dfs(root->right);
202
- }
203
- };
204
194
dfs(root);
205
195
}
206
196
207
197
bool find(int target) {
208
- return vis.count (target);
198
+ return s.contains (target);
209
199
}
210
200
211
201
private:
212
- unordered_set<int > vis;
202
+ unordered_set<int > s;
203
+
204
+ void dfs (TreeNode* root) {
205
+ s.insert(root->val);
206
+ if (root->left) {
207
+ root->left->val = root->val * 2 + 1;
208
+ dfs(root->left);
209
+ }
210
+ if (root->right) {
211
+ root->right->val = root->val * 2 + 2;
212
+ dfs(root->right);
213
+ }
214
+ };
213
215
};
214
216
215
217
/**
@@ -229,15 +231,15 @@ private:
229
231
* }
230
232
*/
231
233
type FindElements struct {
232
- vis map [int ]bool
234
+ s map[int]bool
233
235
}
234
236
235
237
func Constructor(root *TreeNode) FindElements {
236
238
root.Val = 0
237
- vis := map [int ]bool {}
239
+ s := map[int]bool{}
238
240
var dfs func(*TreeNode)
239
241
dfs = func(root *TreeNode) {
240
- vis [root.Val ] = true
242
+ s [root.Val] = true
241
243
if root.Left != nil {
242
244
root.Left.Val = root.Val*2 + 1
243
245
dfs(root.Left)
@@ -248,11 +250,11 @@ func Constructor(root *TreeNode) FindElements {
248
250
}
249
251
}
250
252
dfs(root)
251
- return FindElements{vis }
253
+ return FindElements{s }
252
254
}
253
255
254
256
func (this *FindElements) Find(target int) bool {
255
- return this.vis [target]
257
+ return this.s [target]
256
258
}
257
259
258
260
/**
@@ -262,6 +264,52 @@ func (this *FindElements) Find(target int) bool {
262
264
*/
263
265
```
264
266
267
+ ``` ts
268
+ /**
269
+ * Definition for a binary tree node.
270
+ * class TreeNode {
271
+ * val: number
272
+ * left: TreeNode | null
273
+ * right: TreeNode | null
274
+ * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
275
+ * this.val = (val===undefined ? 0 : val)
276
+ * this.left = (left===undefined ? null : left)
277
+ * this.right = (right===undefined ? null : right)
278
+ * }
279
+ * }
280
+ */
281
+
282
+ class FindElements {
283
+ private s: Set <number > = new Set <number >();
284
+
285
+ constructor (root : TreeNode | null ) {
286
+ root .val = 0 ;
287
+ const dfs = (root : TreeNode ) => {
288
+ this .s .add (root .val );
289
+ if (root .left ) {
290
+ root .left .val = root .val * 2 + 1 ;
291
+ dfs (root .left );
292
+ }
293
+ if (root .right ) {
294
+ root .right .val = root .val * 2 + 2 ;
295
+ dfs (root .right );
296
+ }
297
+ };
298
+ dfs (root );
299
+ }
300
+
301
+ find(target : number ): boolean {
302
+ return this .s .has (target );
303
+ }
304
+ }
305
+
306
+ /**
307
+ * Your FindElements object will be instantiated and called as such:
308
+ * var obj = new FindElements(root)
309
+ * var param_1 = obj.find(target)
310
+ */
311
+ ```
312
+
265
313
<!-- tabs:end -->
266
314
267
315
<!-- end -->
0 commit comments