思路:中序遍历搜索树,用一个变量 pre 存储当前节点 root 在中序序列的前一个节点(第一个节点的前一个为NULL),只要pre的值大于root的值,则记录这个pre,这是其中一个出错的位置,同样的过程记录好两个位置后,进行位置调换即可。
code:
class Solution {
TreeNode *pre = NULL;
TreeNode *node1 = NULL,*node2 = NULL;
public:
void preOrderTree(TreeNode *root){
if(root == NULL)
return;
preOrderTree(root->left);
if(pre != NULL && pre->val > root->val){
node2 = root;
if(node1 == NULL)
node1 = pre;
}
pre = root;
preOrderTree(root->right);
}
void recoverTree(TreeNode *root) {
preOrderTree(root);
if(node1 != NULL && node2 != NULL){
int i = node1->val;
node1->val = node2->val;
node2->val = i;
}
}
};