题目描述:
给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。
进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?
思路:
中序遍历二叉树,如果有一对降序,那么交换这两个节点的值
如果有两对降序,那么交换第一个降序对的第一个节点的值和最后一个降序对的组后一个节点值
代码如下:
class Solution {
public:
TreeNode* pre,t1,t2;
void recoverTree(TreeNode* root) {
inorder(root);
int temp=t1->val;
t1->val=t2->val;
t2->val=temp;
}
void inorder(TreeNode* root){
if(root==nullptr){
return;
}
inorder(toot->left);
if(pre!=nullptr&&pre->val>root->val){
if(t1=nullptr){
t1=pre;
}
t2=root;
}
pre=root;
inorder(root->right);
}
};