# 恢复二叉搜索树

<p>给你二叉搜索树的根节点 <code>root</code> ，该树中的两个节点被错误地交换。请在不改变其结构的情况下，恢复这棵树。</p><p><strong>进阶：</strong>使用 O(<em>n</em>) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗？</p><p> </p><p><strong>示例 1：</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0000-0099/0099.Recover%20Binary%20Search%20Tree/images/recover1.jpg" style="width: 422px; height: 302px;" /><pre><strong>输入：</strong>root = [1,3,null,null,2]<strong><br />输出：</strong>[3,1,null,null,2]<strong><br />解释：</strong>3 不能是 1 左孩子，因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。</pre><p><strong>示例 2：</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0000-0099/0099.Recover%20Binary%20Search%20Tree/images/recover2.jpg" style="width: 581px; height: 302px;" /><pre><strong>输入：</strong>root = [3,1,4,null,null,2]<strong><br />输出：</strong>[2,1,4,null,null,3]<strong><br />解释：</strong>2 不能在 3 的右子树中，因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。</pre><p> </p><p><strong>提示：</strong></p><ul>	<li>树上节点的数目在范围 <code>[2, 1000]</code> 内</li>	<li><code>-2<sup>31</sup> <= Node.val <= 2<sup>31</sup> - 1</code></li></ul>

以下程序实现了这一功能，请你填补空白处内容：

```cpp
#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode() : val(0), left(nullptr), right(nullptr) {}
	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
	TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution
{
public:
	void recoverTree(TreeNode *root)
	{
		dfs(root);
		int tmp = p0_->val;
		p0_->val = p1_->val;
		p1_->val = tmp;
	}
private:
	int wrong_ = 0;
	TreeNode *prev_ = nullptr;
	TreeNode *p0_ = nullptr;
	TreeNode *p1_ = nullptr;
	void dfs(TreeNode *root)
	{
		if (root == nullptr || wrong_ == 2)
		{
			return;
		}
		_____________________;
	}
};
```

## template

```cpp
#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode() : val(0), left(nullptr), right(nullptr) {}
	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
	TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution
{
public:
	void recoverTree(TreeNode *root)
	{
		dfs(root);
		int tmp = p0_->val;
		p0_->val = p1_->val;
		p1_->val = tmp;
	}
private:
	int wrong_ = 0;
	TreeNode *prev_ = nullptr;
	TreeNode *p0_ = nullptr;
	TreeNode *p1_ = nullptr;
	void dfs(TreeNode *root)
	{
		if (root == nullptr || wrong_ == 2)
		{
			return;
		}
		dfs(root->left);
		if (prev_ != nullptr && prev_->val > root->val)
		{
			if (++wrong_ == 1)
			{
				p0_ = prev_;
				p1_ = root;
			}
			else if (wrong_ == 2)
			{
				p1_ = root;
			}
		}
		prev_ = root;
		dfs(root->right);
	}
};
```

## 答案

```cpp
dfs(root->left);
if (prev_ != nullptr && prev_->val > root->val)
{
	if (++wrong_ == 1)
	{
		p0_ = prev_;
		p1_ = root;
	}
	else if (wrong_ == 2)
	{
		p1_ = root;
	}
}
prev_ = root;
dfs(root->right);
```

## 选项

### A

```cpp
dfs(root->right);
if (prev_ != nullptr && prev_->val > root->val)
{
	if (++wrong_ == 1)
	{
		p0_ = prev_;
		p1_ = root;
	}
	else if (wrong_ == 2)
	{
		p1_ = root;
	}
}
prev_ = root;
dfs(root->left);
```

### B

```cpp
dfs(root->right);
if (prev_ != nullptr && prev_->val > root->val)
{
	if (++wrong_ == 1)
	{
		p0_ = prev_;
		p1_ = root;
	}
}
prev_ = root;
dfs(root->left);
```

### C

```cpp
dfs(root->left);
if (prev_ != nullptr && prev_->val > root->val)
{
	if (++wrong_ == 1)
	{
		p0_ = prev_;
		p1_ = root;
	}
}
prev_ = root;
dfs(root->right);
```