美文网首页
LeetCode Recover Binary Search T

LeetCode Recover Binary Search T

作者: codingcyx | 来源:发表于2018-04-13 16:31 被阅读0次

    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?

    思想:此题一定是通过中序遍历得出结果。在该BST的中序遍历结果中,第一个出错的数一定比它后面的数大,第二个出错的数一定比它前面的小(关键:有可能两个数相邻,也有可能两个数不相邻,不相邻的时候second被更新两次)。

    解法一(递归):

    TreeNode* pre = NULL;
        TreeNode* first = NULL;
        TreeNode* second = NULL;
        void recoverTree(TreeNode* root) {
            dfs(root);
            swap(first -> val, second -> val);
        }
        void dfs(TreeNode* root) {
            if(!root) return ;
            dfs(root -> left);
            if(pre && pre -> val > root -> val){
                if(!first) 
                    first = pre;
                second = root;
            }
            pre = root;
            dfs(root -> right);
        }
    

    解法二(开辟栈空间辅助中序遍历):

    void recoverTree(TreeNode* root) {
            TreeNode* p = root;
            TreeNode* pre = NULL;
            TreeNode* first = NULL;
            TreeNode* second = NULL;
            stack<TreeNode*> st;
            while(!st.empty() || p){
                if(p){
                    st.push(p);
                    p = p -> left;
                }
                else{
                    p = st.top();
                    st.pop();
                    if(pre && pre -> val > p -> val){
                        if(first == NULL)
                            first = pre;
                        second = p;
                    }
                    pre = p;
                    p = p -> right;
                }
            }
            swap(first -> val, second -> val);
        }
    

    解法三(Morris Traversal):
    注:Morris Traversal会改变树的结构,要注意恢复原来的结构。

    void recoverTree(TreeNode* root) {
            TreeNode *cur = root, *tmp = NULL;
            TreeNode *pre = NULL;
            TreeNode *first = NULL, *second = NULL;
            while(cur){
                if(pre && pre -> val > cur -> val){
                     if(first == NULL)
                        first = pre;
                    second = cur;
                }
                if(cur -> left){
                    tmp = cur -> left;
                    while(tmp -> right && tmp -> right != cur)
                        tmp = tmp -> right;
                    if(tmp -> right == cur){
                        tmp -> right = NULL;                   
                        pre = cur;
                        cur = cur -> right;
                    }
                    else{
                        tmp -> right = cur;
                        cur = cur -> left;
                    }
                }
                else{
                    pre = cur;
                    cur = cur -> right;
                }
            }
            swap(first -> val, second -> val);
        }
    

    参考资料:
    https://leetcode.com/problems/recover-binary-search-tree/discuss/32562/Share-my-solutions-and-detailed-explanation-with-recursiveiterative-in-order-traversal-and-Morris-traversal

    相关文章

      网友评论

          本文标题:LeetCode Recover Binary Search T

          本文链接:https://www.haomeiwen.com/subject/fythkftx.html