[leetcode]Recover Binary Search Tree

其实我的解法不符合题意的。。。TAT

不过我觉得O(1)的空间复杂度那种遍历方法似乎也没太大用吧。

其实就是中序遍历二叉树,那么得到一个序列。

按理说应该是递增的,不过有两个交换了,那么找出这两个就好了。

(在这里有卡了,写代码能力好弱啊。。。。。

我们首先顺序找到第一个不符合的(当然就是比后面的数字要大的。。。因为交换肯定把大的换前面了

然后再从这个开始扫描,找到第一个大于这个数的节点(那么前面这个就是需要找的啦

ex.

1 2 3 4 5

交换

4 2 3 1 5

开始找到4

然后找到5

5前面是1

交换1,4

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    void travel(TreeNode* root , vector<TreeNode*>& que){
        if(root == nullptr) return;
        travel(root -> left,que);
        que.push_back(root);
        travel(root -> right,que);
    }
    void recoverTree(TreeNode *root) {
        vector<TreeNode*> que;
        travel(root , que);
        
        int size = que.size();
        TreeNode* first = nullptr;
        TreeNode* second = nullptr;
        for(int i = 0 ; i < size ; i++){
           if(first == nullptr && i + 1 < size && que[i]->val > que[i+1]-> val){
               first = que[i];
               i ++;
               while(i < size && que[i] -> val < first -> val ) i++;
               if(i == size){
                   second = que.back();
               }else{
                   second = que[i - 1];
               }
               
               swap(first -> val , second -> val);
           }
        }
    }
};
原文地址:https://www.cnblogs.com/x1957/p/3507880.html