Skip to content

Commit f9908d9

Browse files
committed
feat: add solutions to lc problem: No.0099
No.0099.Recover Binary Search Tree
1 parent d639583 commit f9908d9

File tree

7 files changed

+504
-94
lines changed

7 files changed

+504
-94
lines changed

solution/0000-0099/0099.Recover Binary Search Tree/README.md

+180-12
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
<li><code>-2<sup>31</sup> <= Node.val <= 2<sup>31</sup> - 1</code></li>
3737
</ul>
3838

39-
4039
## 解法
4140

4241
<!-- 这里可写通用的实现逻辑 -->
@@ -55,33 +54,202 @@
5554
# self.left = left
5655
# self.right = right
5756
class Solution:
58-
first = None
59-
second = None
60-
prev = None
61-
62-
def recoverTree(self, root: TreeNode) -> None:
57+
def recoverTree(self, root: Optional[TreeNode]) -> None:
6358
"""
6459
Do not return anything, modify root in-place instead.
6560
"""
6661
def dfs(root):
62+
nonlocal prev, first, second
6763
if root:
6864
dfs(root.left)
69-
if self.prev and root.val < self.prev.val:
70-
if not self.first:
71-
self.first = self.prev
72-
self.second = root
73-
self.prev = root
65+
if prev:
66+
if first is None and root.val < prev.val:
67+
first = prev
68+
if first and root.val < prev.val:
69+
second = root
70+
prev = root
7471
dfs(root.right)
72+
73+
prev = first = second = None
7574
dfs(root)
76-
self.first.val, self.second.val = self.second.val, self.first.val
75+
first.val, second.val = second.val, first.val
7776
```
7877

7978
### **Java**
8079

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

8382
```java
83+
/**
84+
* Definition for a binary tree node.
85+
* public class TreeNode {
86+
* int val;
87+
* TreeNode left;
88+
* TreeNode right;
89+
* TreeNode() {}
90+
* TreeNode(int val) { this.val = val; }
91+
* TreeNode(int val, TreeNode left, TreeNode right) {
92+
* this.val = val;
93+
* this.left = left;
94+
* this.right = right;
95+
* }
96+
* }
97+
*/
98+
class Solution {
99+
private TreeNode prev;
100+
private TreeNode first;
101+
private TreeNode second;
102+
103+
public void recoverTree(TreeNode root) {
104+
dfs(root);
105+
int t = first.val;
106+
first.val = second.val;
107+
second.val = t;
108+
}
109+
110+
private void dfs(TreeNode root) {
111+
if (root == null) {
112+
return;
113+
}
114+
dfs(root.left);
115+
if (prev != null) {
116+
if (first == null && prev.val > root.val) {
117+
first = prev;
118+
}
119+
if (first != null && prev.val > root.val) {
120+
second = root;
121+
}
122+
}
123+
prev = root;
124+
dfs(root.right);
125+
}
126+
}
127+
```
128+
129+
### **C++**
130+
131+
```cpp
132+
/**
133+
* Definition for a binary tree node.
134+
* struct TreeNode {
135+
* int val;
136+
* TreeNode *left;
137+
* TreeNode *right;
138+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
139+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
140+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
141+
* };
142+
*/
143+
class Solution {
144+
public:
145+
TreeNode* prev;
146+
TreeNode* first;
147+
TreeNode* second;
148+
149+
void recoverTree(TreeNode* root) {
150+
dfs(root);
151+
swap(first->val, second->val);
152+
}
153+
154+
void dfs(TreeNode* root) {
155+
if (!root) return;
156+
dfs(root->left);
157+
if (prev)
158+
{
159+
if (!first && prev->val > root->val) first = prev;
160+
if (first && prev->val > root->val) second = root;
161+
}
162+
prev = root;
163+
dfs(root->right);
164+
}
165+
};
166+
```
167+
168+
### **Go**
169+
170+
```go
171+
/**
172+
* Definition for a binary tree node.
173+
* type TreeNode struct {
174+
* Val int
175+
* Left *TreeNode
176+
* Right *TreeNode
177+
* }
178+
*/
179+
func recoverTree(root *TreeNode) {
180+
var prev *TreeNode
181+
var first *TreeNode
182+
var second *TreeNode
183+
184+
var dfs func(root *TreeNode)
185+
dfs = func(root *TreeNode) {
186+
if root == nil {
187+
return
188+
}
189+
dfs(root.Left)
190+
if prev != nil {
191+
if first == nil && prev.Val > root.Val {
192+
first = prev
193+
}
194+
if first != nil && prev.Val > root.Val {
195+
second = root
196+
}
197+
}
198+
prev = root
199+
dfs(root.Right)
200+
}
201+
202+
dfs(root)
203+
first.Val, second.Val = second.Val, first.Val
204+
}
205+
```
206+
207+
### **C#**
208+
209+
```cs
210+
/**
211+
* Definition for a binary tree node.
212+
* public class TreeNode {
213+
* public int val;
214+
* public TreeNode left;
215+
* public TreeNode right;
216+
* public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
217+
* this.val = val;
218+
* this.left = left;
219+
* this.right = right;
220+
* }
221+
* }
222+
*/
223+
public class Solution {
224+
private TreeNode prev, first, second;
225+
226+
public void RecoverTree(TreeNode root) {
227+
dfs(root);
228+
int t = first.val;
229+
first.val = second.val;
230+
second.val = t;
231+
}
84232

233+
private void dfs(TreeNode root) {
234+
if (root != null)
235+
{
236+
dfs(root.left);
237+
if (prev != null)
238+
{
239+
if (first == null && prev.val > root.val)
240+
{
241+
first = prev;
242+
}
243+
if (first != null && prev.val > root.val)
244+
{
245+
second = root;
246+
}
247+
}
248+
prev = root;
249+
dfs(root.right);
250+
}
251+
}
252+
}
85253
```
86254

87255
### **...**

0 commit comments

Comments
 (0)