Skip to content

Commit f2eecdc

Browse files
committed
feat: add solutions to lcof2 problem: No.056.Two Sum IV - Input is a BST
1 parent ff70914 commit f2eecdc

File tree

13 files changed

+391
-124
lines changed

13 files changed

+391
-124
lines changed

lcof2/剑指 Offer II 056. 二叉搜索树中两个节点之和/README.md

Lines changed: 143 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,164 @@
4444

4545
<!-- 这里可写通用的实现逻辑 -->
4646

47+
用哈希表记录访问过的节点。
48+
4749
<!-- tabs:start -->
4850

4951
### **Python3**
5052

5153
<!-- 这里可写当前语言的特殊实现逻辑 -->
5254

5355
```python
54-
56+
# Definition for a binary tree node.
57+
# class TreeNode:
58+
# def __init__(self, val=0, left=None, right=None):
59+
# self.val = val
60+
# self.left = left
61+
# self.right = right
62+
class Solution:
63+
def findTarget(self, root: TreeNode, k: int) -> bool:
64+
def find(root):
65+
if not root:
66+
return False
67+
if k - root.val in nodes:
68+
return True
69+
nodes.add(root.val)
70+
return find(root.left) or find(root.right)
71+
72+
nodes = set()
73+
return find(root)
5574
```
5675

5776
### **Java**
5877

5978
<!-- 这里可写当前语言的特殊实现逻辑 -->
6079

6180
```java
81+
/**
82+
* Definition for a binary tree node.
83+
* public class TreeNode {
84+
* int val;
85+
* TreeNode left;
86+
* TreeNode right;
87+
* TreeNode() {}
88+
* TreeNode(int val) { this.val = val; }
89+
* TreeNode(int val, TreeNode left, TreeNode right) {
90+
* this.val = val;
91+
* this.left = left;
92+
* this.right = right;
93+
* }
94+
* }
95+
*/
96+
class Solution {
97+
private Set<Integer> nodes;
98+
99+
public boolean findTarget(TreeNode root, int k) {
100+
nodes = new HashSet<>();
101+
return find(root, k);
102+
}
103+
104+
private boolean find(TreeNode root, int k) {
105+
if (root == null) {
106+
return false;
107+
}
108+
if (nodes.contains(k - root.val)) {
109+
return true;
110+
}
111+
nodes.add(root.val);
112+
return find(root.left, k) || find(root.right, k);
113+
}
114+
}
115+
```
116+
117+
### **TypeScript**
118+
119+
```ts
120+
/**
121+
* Definition for a binary tree node.
122+
* class TreeNode {
123+
* val: number
124+
* left: TreeNode | null
125+
* right: TreeNode | null
126+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
127+
* this.val = (val===undefined ? 0 : val)
128+
* this.left = (left===undefined ? null : left)
129+
* this.right = (right===undefined ? null : right)
130+
* }
131+
* }
132+
*/
133+
134+
function findTarget(root: TreeNode | null, k: number): boolean {
135+
let nodes: Set<number> = new Set();
136+
return find(root, k, nodes);
137+
};
138+
139+
function find(root: TreeNode | null, k: number, nodes: Set<number>): boolean {
140+
if (!root) return false;
141+
if (nodes.has(k - root.val)) return true;
142+
nodes.add(root.val);
143+
return find(root.left, k, nodes) || find(root.right, k, nodes);
144+
}
145+
```
146+
147+
### **C++**
148+
149+
```cpp
150+
/**
151+
* Definition for a binary tree node.
152+
* struct TreeNode {
153+
* int val;
154+
* TreeNode *left;
155+
* TreeNode *right;
156+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
157+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
158+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
159+
* };
160+
*/
161+
class Solution {
162+
public:
163+
unordered_set<int> nodes;
164+
165+
bool findTarget(TreeNode* root, int k) {
166+
return find(root, k);
167+
}
168+
169+
bool find(TreeNode* root, int k) {
170+
if (!root) return false;
171+
if (nodes.count(k - root->val)) return true;
172+
nodes.insert(root->val);
173+
return find(root->left, k) || find(root->right, k);
174+
}
175+
};
176+
```
62177
178+
### **Go**
179+
180+
```go
181+
/**
182+
* Definition for a binary tree node.
183+
* type TreeNode struct {
184+
* Val int
185+
* Left *TreeNode
186+
* Right *TreeNode
187+
* }
188+
*/
189+
func findTarget(root *TreeNode, k int) bool {
190+
nodes := make(map[int]bool)
191+
192+
var find func(root *TreeNode, k int) bool
193+
find = func(root *TreeNode, k int) bool {
194+
if root == nil {
195+
return false
196+
}
197+
if nodes[k-root.Val] {
198+
return true
199+
}
200+
nodes[root.Val] = true
201+
return find(root.Left, k) || find(root.Right, k)
202+
}
203+
return find(root, k)
204+
}
63205
```
64206

65207
### **...**
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
8+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10+
* };
11+
*/
12+
class Solution {
13+
public:
14+
unordered_set<int> nodes;
15+
16+
bool findTarget(TreeNode* root, int k) {
17+
return find(root, k);
18+
}
19+
20+
bool find(TreeNode* root, int k) {
21+
if (!root) return false;
22+
if (nodes.count(k - root->val)) return true;
23+
nodes.insert(root->val);
24+
return find(root->left, k) || find(root->right, k);
25+
}
26+
};
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* type TreeNode struct {
4+
* Val int
5+
* Left *TreeNode
6+
* Right *TreeNode
7+
* }
8+
*/
9+
func findTarget(root *TreeNode, k int) bool {
10+
nodes := make(map[int]bool)
11+
12+
var find func(root *TreeNode, k int) bool
13+
find = func(root *TreeNode, k int) bool {
14+
if root == nil {
15+
return false
16+
}
17+
if nodes[k-root.Val] {
18+
return true
19+
}
20+
nodes[root.Val] = true
21+
return find(root.Left, k) || find(root.Right, k)
22+
}
23+
return find(root, k)
24+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode() {}
8+
* TreeNode(int val) { this.val = val; }
9+
* TreeNode(int val, TreeNode left, TreeNode right) {
10+
* this.val = val;
11+
* this.left = left;
12+
* this.right = right;
13+
* }
14+
* }
15+
*/
16+
class Solution {
17+
private Set<Integer> nodes;
18+
19+
public boolean findTarget(TreeNode root, int k) {
20+
nodes = new HashSet<>();
21+
return find(root, k);
22+
}
23+
24+
private boolean find(TreeNode root, int k) {
25+
if (root == null) {
26+
return false;
27+
}
28+
if (nodes.contains(k - root.val)) {
29+
return true;
30+
}
31+
nodes.add(root.val);
32+
return find(root.left, k) || find(root.right, k);
33+
}
34+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
class Solution:
8+
def findTarget(self, root: TreeNode, k: int) -> bool:
9+
def find(root):
10+
if not root:
11+
return False
12+
if k - root.val in nodes:
13+
return True
14+
nodes.add(root.val)
15+
return find(root.left) or find(root.right)
16+
17+
nodes = set()
18+
return find(root)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* class TreeNode {
4+
* val: number
5+
* left: TreeNode | null
6+
* right: TreeNode | null
7+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
8+
* this.val = (val===undefined ? 0 : val)
9+
* this.left = (left===undefined ? null : left)
10+
* this.right = (right===undefined ? null : right)
11+
* }
12+
* }
13+
*/
14+
15+
function findTarget(root: TreeNode | null, k: number): boolean {
16+
let nodes: Set<number> = new Set();
17+
return find(root, k, nodes);
18+
};
19+
20+
function find(root: TreeNode | null, k: number, nodes: Set<number>): boolean {
21+
if (!root) return false;
22+
if (nodes.has(k - root.val)) return true;
23+
nodes.add(root.val);
24+
return find(root.left, k, nodes) || find(root.right, k, nodes);
25+
}

0 commit comments

Comments
 (0)