1. 程式人生 > >Crack LeetCode 之 98. Validate Binary Search Tree

Crack LeetCode 之 98. Validate Binary Search Tree

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

BST的兩個節點被調換了位置,如何恢復?
我們對BST做中序遍歷應該得到一個有序序列,但是節點被調換位置的話,中序遍歷就會遇到一個節點的前序節點比該節點大的情況,所以我們可以用中序遍歷找到位置錯誤的節點。
節點調換位置有兩種情況:一是相鄰兩個節點被調換;二是不相鄰的兩個節點被調換。對於前者,中序遍歷後只會有一次順序不對的情況,我們只需要調換這兩個節點的位置;對於後者則會有兩次順序不匹配,我們要把第一次順序不匹配的第一個節點和第二次的第二個節點對調位置。

以下程式碼的時間複雜度是O(n),空間複雜度是O(1)。

class Solution
{
    TreeNode* m_pre;
    vector<TreeNode*> m_res;

public:
    Solution()
    {
        m_pre = NULL;
    }

    void recoverTree(TreeNode* root)
    {
        helper(root);
        
        if ( m_res.empty() == false ) {
            int tmp = m_res[1]->val;
            m_res[1]->val = m_res[0]->val;
            m_res[0]->val = tmp;
        }
    }

    void helper(TreeNode* root)
    {
        if(root == NULL)
            return;

        helper(root->left);

        if(m_pre!=NULL && m_pre->val > root->val) {
            if ( m_res.empty() ) {
                m_res.push_back(m_pre);
                m_res.push_back(root);
            }
            else {
                m_res[1] = root;
            }
        }

        m_pre = root;

        helper(root->right);
    }
};