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