leetcode : Recover Binary Search Tree

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?

思路很简单,即按照中根顺序遍历树,同时记录前一个节点的指针pre,如果pre->val > root->val; 则说明有一个节点是坏点,

并且第一次大于的时候,pre是坏点,第二次大于的时候,root是坏点

但是注意特殊情况即 被交换的两个节点在中根遍历序列中是连续的

这样的话只会发生一次大于的情况,所以可以在记录坏点的同时记下该坏点之后的那个指针

AC代码:

class Solution {
public:
    void recoverTree(TreeNode *root) {
        vector<vector<TreeNode* >> badnodes;
        TreeNode * pre = NULL;
        inorder(root, badnodes, pre);
        if(badnodes.size() == 1){
            swap(badnodes[0][0]->val,badnodes[0][1]->val);
            return;
        }
        swap(badnodes[0][0]->val,badnodes[1][0]->val);
    }
    void inorder(TreeNode *root, vector<vector<TreeNode *>> &badnodes, TreeNode *&pre){
        if(root->left)
            inorder(root->left, badnodes, pre);
        
        if(!pre)                       
            pre = root;
        else if(badnodes.size() == 2)
            return;
        else if(pre->val > root->val){
            if(badnodes.size() == 0){
                vector<TreeNode*> temp;
                temp.push_back(pre);
                temp.push_back(root);
                badnodes.push_back(temp);
            }
            else if(badnodes.size() == 1){
                vector<TreeNode *> temp;
                temp.push_back(root);
                badnodes.push_back(temp);
            }
        }
        pre = root;
        
        if(root->right)
            inorder(root->right, badnodes, pre);
    }
};

 

posted on 2014-11-24 09:32  远近闻名的学渣  阅读(170)  评论(0)    收藏  举报

导航