LeetCode 99. 恢复二叉搜索树 (BST的中序遍历+线性时间里找到两个被颠倒的数字)

恢复二叉搜索树
题目大意:二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。

  • 如何在线性开销里找到"近似排序"数组里颠倒的两个数字
    思路:这样的“近似数组”里,最多只有两组逆序对。
        //在线性开销里找到"近似排序"数组里颠倒的两个数字
        for(int i=0;i<list.size()-1;i++){
            if(list[i+1]<list[i]){
                y = list[i+1];
                if(x==-1) x = list[i];
                else break;
            }
        } 
  • 如何做到只用常数空间?
    可能利用到Moris遍历吧,日后再说。
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> list;
    int x=-1,y=-1;
    void recoverTree(TreeNode* root) {
        inOrder(root);
        //在线性开销里找到"近似排序"数组里颠倒的两个数字
        for(int i=0;i<list.size()-1;i++){
            if(list[i+1]<list[i]){
                y = list[i+1];
                if(x==-1) x = list[i];
                else break;
            }
        } 
        modify(root);
    }
    void modify(TreeNode* root){
        if(!root){
            return ;
        }
        if(root->val == x ){
            root->val = y;
        }else if(root->val == y ){
            root->val = x;
        }
        modify(root->left);
        modify(root->right);        
    }
    void inOrder(TreeNode* root){
        if(!root){
            return ;
        }
        inOrder(root->left);
        list.push_back(root->val);
        inOrder(root->right);
    }
};

你可能感兴趣的:(LeetCode,#,LC二叉树)