File tree

2 files changed

+154
-0
lines changed

2 files changed

+154
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#include<vector>
2+
#include<algorithm>
3+
#include<iostream>
4+
using namespace std;
5+
/**
6+
* Definition for a binary tree node.
7+
*/
8+
struct TreeNode {
9+
int val;
10+
TreeNode *left;
11+
TreeNode *right;
12+
TreeNode() : val(0), left(nullptr), right(nullptr) {}
13+
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
14+
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
15+
};
16+
17+
class Solution {
18+
public:
19+
void recoverTree(TreeNode* root) {
20+
TreeNode* first = nullptr; /* first: 记录第1个交换的点(逆序对) */
21+
TreeNode* second; /* second: 记录第2个交换的点 */
22+
TreeNode* last = nullptr; // last: 当前遍历指针所在位置的上一个node
23+
while (root != nullptr)
24+
{
25+
if (root->left == nullptr) /* 如果没有左子树, 就遍历当前点 */
26+
{
27+
if (last != nullptr && last->val > root->val) // 出现了逆序对
28+
{
29+
if (first == nullptr) // 如果是第1个逆序对, 就把逆序对的两个点都存下来
30+
{
31+
first = last;
32+
second = root;
33+
}
34+
else second = root; /* 如果是第2个逆序对, 只需把逆序对的第2个点都存下来 */
35+
}
36+
last = root; // 把当前点赋值给last, 为下一轮迭代做准备
37+
root = root->right;
38+
}
39+
else // 搭桥: 需要先找到前驱结点
40+
{
41+
auto p = root->left;
42+
while (p->right != nullptr && p->right != root) /* 如果当前结点(root)不为空且没有出现环路, 就继续向右移 */
43+
p = p->right;
44+
if (p->right == nullptr)
45+
{
46+
p->right = root; /* 搭桥 */
47+
root = root->left;
48+
}
49+
else
50+
{
51+
// 拆桥
52+
p->right = nullptr;
53+
if (last != nullptr && last->val > root->val) // 出现了逆序对, 下面的做法与前面相同
54+
{
55+
if (first == nullptr)
56+
{
57+
first = last;
58+
second = root;
59+
}
60+
else second = root;
61+
}
62+
last = root;
63+
root = root->right;
64+
}
65+
}
66+
}
67+
swap(first->val, second->val); // 把错误交换了的结点的值恢复回来
68+
}
69+
};
70+
71+
// Test
72+
int main()
73+
{
74+
Solution sol;
75+
76+
TreeNode* root = new TreeNode(3);
77+
root->left = new TreeNode(1);
78+
root->right = new TreeNode(4);
79+
root->right->left = new TreeNode(2);
80+
81+
sol.recoverTree(root);
82+
cout << root->val << endl; /* 输出恢复后的根结点的值 */
83+
84+
return 0;
85+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include<vector>
2+
#include<algorithm>
3+
#include<iostream>
4+
using namespace std;
5+
/**
6+
* Definition for a binary tree node.
7+
*/
8+
struct TreeNode {
9+
int val;
10+
TreeNode *left;
11+
TreeNode *right;
12+
TreeNode() : val(0), left(nullptr), right(nullptr) {}
13+
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
14+
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
15+
};
16+
17+
class Solution {
18+
TreeNode* lastSeen = new TreeNode(INT_MIN);
19+
TreeNode* first = nullptr;
20+
TreeNode* second = nullptr;
21+
public:
22+
void recoverTree(TreeNode* root)
23+
{
24+
inOrder(root);
25+
int tempVal = first->val;
26+
first->val = second->val;
27+
second->val = tempVal;
28+
}
29+
30+
void inOrder(TreeNode* node)
31+
{
32+
if (node == nullptr) return;
33+
34+
inOrder(node->left);
35+
if (node->val >= lastSeen->val)
36+
lastSeen = node;
37+
else /* 出现异常点 */
38+
{
39+
if (first == nullptr) /* 第1处异常点 */
40+
{
41+
first = lastSeen;
42+
second = node;
43+
lastSeen = node;
44+
}
45+
else /* 第2处异常点 */
46+
{
47+
second = node;
48+
return;
49+
}
50+
}
51+
inOrder(node->right);
52+
}
53+
};
54+
55+
// Test
56+
int main()
57+
{
58+
Solution sol;
59+
60+
TreeNode* root = new TreeNode(3);
61+
root->left = new TreeNode(1);
62+
root->right = new TreeNode(4);
63+
root->right->left = new TreeNode(2);
64+
65+
sol.recoverTree(root);
66+
cout << root->val << endl; /* 输出恢复后的根结点的值 */
67+
68+
return 0;
69+
}

0 commit comments

Comments
 (0)