首先,对BST中序遍历,得到的就是有序数列。 所以,交换BST中的两个节点,会相应导致中序遍历序列的两个节点位置的交换。
以例子说明: 对于序列1,2,3,4,5,6,7 交换两个数字有两种情况
1, 交换相邻的两个, 比如2,3. 会得到 1,3,2,4,5,6,7 , 会出现一个数的小于其前驱的情况, 那只需要把这个数和它的前驱交换即可;
2,交换非相邻的两个,比如2,6. 会得到1,6,3,4,5,2,7 ,会出现两个数字小于其前驱的情况,这个时候就需要交换第一个数的前驱和第二个数。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode*>v;
TreeNode *pre;
void check(TreeNode *root)
{
if(v.size() == 4) return;
if(root->left) check(root->left);
int key = root->val;
if(pre)
{
if(key < pre->val)
{
v.push_back(pre);
v.push_back(root);
}
}
pre = root;
if(root->right) check(root->right);
}
void recoverTree(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(root == NULL) return;
v.clear();
pre = NULL;
check(root);
swap(v[0]->val, v[v.size()-1]->val);
}
};