LeetCode-Recover Binary Search Tree-恢复二叉排序树

https://oj.leetcode.com/problems/recover-binary-search-tree/

思路是首先按中序把节点序列打到数组里。然后扫描数组看是哪两个数需要交换。考虑ai和aj是需要交换的两个值,其中i<j。则现在应该有a[i+1]<a[i],a[j]<a[j-1]。所以只需要找到两个小于前面数的数字即可。

一个边界情况是,实际需要交换的元素就是a[i]和a[i+1]。这种情况应该只能找到一个不合法的i,此时另一个需要交换的设置为i即可。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int n,m;
    vector <TreeNode *> v;
    void InOrder(TreeNode *root){
        if (root==NULL) return;
        InOrder(root->left);
        v.push_back(root);
        InOrder(root->right);
    }
    void recoverTree(TreeNode *root) {
        InOrder(root);
        n=v.size();
        if (n<=1) return;
        int ps[2];
        int count=0;
        for (int i=1;i<n;i++){
            if (v[i]->val<v[i-1]->val) {
                ps[count++]=i;
            }
        }
        if (count<1) return;
        if (count<2) ps[count++]=ps[0];
        TreeNode *l=v[ps[0]-1];
        TreeNode *r=v[ps[1]];
        swap(l->val,r->val);
    }
};

  

 

posted @ 2014-10-09 21:40  zombies  阅读(140)  评论(0编辑  收藏  举报