1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[leetcode]Recover Binary Search Tree

Posted on 2014-01-06 21:04  1957  阅读(142)  评论(0编辑  收藏  举报

其实我的解法不符合题意的。。。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);
           }
        }
    }
};