zoukankan      html  css  js  c++  java
  • [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);
               }
            }
        }
    };
  • 相关阅读:
    继承
    构造函数,重载
    Java Scanner学习记录
    20131204-数据库基础
    20131128-正则表达式与委托
    20131125-序列化与正则表达式
    20131127-正则表达式
    20131120-接口字符串-小鸭子练习
    20131118-静态类抽象类-外部设备
    20131117-练习面向对象
  • 原文地址:https://www.cnblogs.com/x1957/p/3507880.html
Copyright © 2011-2022 走看看