Skip to content

Commit d4ba79c

Browse files
authored
feat: add solutions to lc problem: No.1261 (#2435)
No.1261.Find Elements in a Contaminated Binary Tree
1 parent 95d6b73 commit d4ba79c

File tree

8 files changed

+231
-90
lines changed

8 files changed

+231
-90
lines changed

Diff for: .github/workflows/deploy.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ jobs:
4646
python3 -m pip install --upgrade pip
4747
python3 -m pip install -r requirements.txt
4848
python3 -m pip install "mkdocs-material[imaging]"
49-
apt-get install pngquant
49+
sudo apt-get install pngquant
5050
5151
- run: |
5252
python3 main.py
@@ -73,4 +73,4 @@ jobs:
7373
gitee-username: yanglbme
7474
gitee-password: ${{ secrets.GITEE_PASSWORD }}
7575
gitee-repo: doocs/leetcode
76-
branch: gh-pages
76+
branch: gh-pages

Diff for: solution/1200-1299/1261.Find Elements in a Contaminated Binary Tree/README.md

+77-29
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ findElements.find(5); // return True
8989

9090
### 方法一:DFS + 哈希表
9191

92-
我们先通过 DFS 遍历二叉树,将节点值恢复为原来的值,然后再通过哈希表存储所有节点值,这样在查找时就可以直接判断目标值是否存在于哈希表中
92+
我们先通过 DFS 遍历二叉树,将节点值恢复为原来的值,并将所有节点值存入哈希表中。然后在查找时,只需要判断哈希表中是否存在目标值即可
9393

9494
时间复杂度方面,初始化时需要遍历二叉树,时间复杂度为 $O(n)$,查找时只需要判断哈希表中是否存在目标值,时间复杂度为 $O(1)$。空间复杂度 $O(n)$。其中 $n$ 为二叉树节点个数。
9595

@@ -103,9 +103,10 @@ findElements.find(5); // return True
103103
# self.left = left
104104
# self.right = right
105105
class FindElements:
106+
106107
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)
109110
if root.left:
110111
root.left.val = root.val * 2 + 1
111112
dfs(root.left)
@@ -114,11 +115,11 @@ class FindElements:
114115
dfs(root.right)
115116

116117
root.val = 0
117-
self.vis = set()
118+
self.s = set()
118119
dfs(root)
119120

120121
def find(self, target: int) -> bool:
121-
return target in self.vis
122+
return target in self.s
122123

123124

124125
# Your FindElements object will be instantiated and called as such:
@@ -143,15 +144,19 @@ class FindElements:
143144
* }
144145
*/
145146
class FindElements {
146-
private Set<Integer> vis = new HashSet<>();
147+
private Set<Integer> s = new HashSet<>();
147148

148149
public FindElements(TreeNode root) {
149150
root.val = 0;
150151
dfs(root);
151152
}
152153

154+
public boolean find(int target) {
155+
return s.contains(target);
156+
}
157+
153158
private void dfs(TreeNode root) {
154-
vis.add(root.val);
159+
s.add(root.val);
155160
if (root.left != null) {
156161
root.left.val = root.val * 2 + 1;
157162
dfs(root.left);
@@ -161,10 +166,6 @@ class FindElements {
161166
dfs(root.right);
162167
}
163168
}
164-
165-
public boolean find(int target) {
166-
return vis.contains(target);
167-
}
168169
}
169170

170171
/**
@@ -190,26 +191,27 @@ class FindElements {
190191
public:
191192
FindElements(TreeNode* root) {
192193
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-
};
204194
dfs(root);
205195
}
206196

207197
bool find(int target) {
208-
return vis.count(target);
198+
return s.contains(target);
209199
}
210200

211201
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+
};
213215
};
214216

215217
/**
@@ -229,15 +231,15 @@ private:
229231
* }
230232
*/
231233
type FindElements struct {
232-
vis map[int]bool
234+
s map[int]bool
233235
}
234236
235237
func Constructor(root *TreeNode) FindElements {
236238
root.Val = 0
237-
vis := map[int]bool{}
239+
s := map[int]bool{}
238240
var dfs func(*TreeNode)
239241
dfs = func(root *TreeNode) {
240-
vis[root.Val] = true
242+
s[root.Val] = true
241243
if root.Left != nil {
242244
root.Left.Val = root.Val*2 + 1
243245
dfs(root.Left)
@@ -248,11 +250,11 @@ func Constructor(root *TreeNode) FindElements {
248250
}
249251
}
250252
dfs(root)
251-
return FindElements{vis}
253+
return FindElements{s}
252254
}
253255
254256
func (this *FindElements) Find(target int) bool {
255-
return this.vis[target]
257+
return this.s[target]
256258
}
257259
258260
/**
@@ -262,6 +264,52 @@ func (this *FindElements) Find(target int) bool {
262264
*/
263265
```
264266

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+
265313
<!-- tabs:end -->
266314

267315
<!-- end -->

0 commit comments

Comments
 (0)