8000 4 · javasharper/leetcode@ffd70e6 · GitHub
[go: up one dir, main page]

Skip to content

Commit ffd70e6

Browse files
committed
4
1 parent 3512997 commit ffd70e6

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/**
2+
* Definition for binary tree
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8+
* };
9+
*/
10+
class Solution {
11+
public:
12+
void recoverTree(TreeNode *root) {
13+
// Start typing your C/C++ solution below
14+
// DO NOT write int main() function
15+
16+
TreeNode *parent = NULL;
17+
TreeNode *current = root;
18+
TreeNode *mistake_node1 = NULL;
19+
TreeNode *mistake_node2 = NULL;
20+
21+
while (current != NULL) {
22+
if (current->left == NULL) {
23+
if (parent && parent->val > current->val) {
24+
if (mistake_node1 == NULL)
25+
mistake_node1 = parent;
26+
mistake_node2 = current;
27+
}
28+
parent = current;
29+
current = current->right;
30+
}
31+
else {
32+
TreeNode *prev = current->left;
33+
while (prev->right && prev->right != current)
34+
prev = prev->right;
35+
36+
if (prev->right == NULL) {
37+
prev->right = current;
38+
current = current->left;
39+
}
40+
else {
41+
if (parent->val > current->val) {
42+
if (mistake_node1 == NULL)
43+
mistake_node1 = parent;
44+
mistake_node2 = current;
45+
}
46+
prev->right = NULL;
47+
parent = current;
48+
current = current->right;
49+
}
50+
}
51+
}
52+
if (mistake_node1 && mistake_node2)
53+
swap(mistake_node1->val, mistake_node2->val);
54+
}
55+
};
56+
// http://fisherlei.blogspot.com/2012/12/leetcode-recover-binary-search-tree.html

0 commit comments

Comments
 (0)
0