题目:
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例:
输入: [1, 3, null, null, 2]
1
/
3
\
2
输出: [3, 1, null, null, 2]
3
/
1
\
2
代码如下:
class Solution {
public:
void recoverTree(TreeNode* root)
{
vector<int> midorder;
stack<TreeNode*> node;
TreeNode* p = root;
while (p || node.size())
{
while (p)
{
node.push(p);
p = p->left;
}
p = node.top();
node.pop();
midorder.push_back(p->val);
p = p->right;
}
vector<int> order(midorder);
sort(order.begin(), order.end());
int x(0);
int y(0);
for (int i = 0; i < order.size(); i++)
{
if (order[i] < midorder[i]) x = order[i];
else if (order[i] > midorder[i]) y = order[i];
}
recover(root, 2, x, y);
}
void recover(TreeNode* root, int count, int x, int y)
{
if (root->val == x)
{
root->val = y;
count -= 1;
}
else if (root->val == y)
{
root->val = x;
count -= 1;
}
if (count == 0) return;
if (root->left) recover(root->left, count, x, y);
if (root->right) recover(root->right, count, x, y);
}
};