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?

思路:中序遍歷。
這道題O(n)的思路就是直接中序遍歷,然後開一個數組存放所有的元素,找到交換位置的兩個元素,最後重新遍歷,把兩個元素交換。
常數空間的思路就是一次中序遍歷,用三個指針,s1,s2,pre分別記錄要交換的兩個指針和root前一個指針,然後注意第一次找到的一定是要交換的s1指針,但是可能第二次找到的不是最終要交換的s2指針,還需要繼續遍歷,更新pre和root,找到最後需要交換的s2指針。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* s1,*s2,*pre;
    void dfs(TreeNode* root){
        if(!root) return;
        dfs(root->left);
        if(pre&&pre->val>root->val){
            if(s1==NULL){
                s1=pre;
                s2=root;
            }
            else
                s2=root;
        }
        pre=root;
        dfs(root->right);
    }
    void recoverTree(TreeNode* root) {
        if(!root) return;
        s1=s2=pre=NULL;
        dfs(root);
        swap(s1->val,s2->val);
    }
};
發佈了121 篇原創文章 · 獲贊 42 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章