7.12 binary search tree

to do

1] Unique Binary Search Trees

    int numTrees(int n) {
        int dp[n+1]= {0};
        dp[0] = 1;
        
        for (int i=1; i<n+1; ++i) {
            for (int mid=1; mid<i+1; ++mid) {
                dp[i] += dp[mid-1] * dp[i-mid];
            }
        }
        return dp[n];
    }

2] Unique Binary Search Trees II

注意loop內(nèi)的順序。。memory

    vector<TreeNode*> generateR(int l, int r) {
        if (l>r) return vector<TreeNode*>{nullptr};
        vector<TreeNode*> ret;
        
        for (int mid=l; mid<r+1; ++mid) {
            vector<TreeNode*> ltrees = generateR(l, mid-1);
            vector<TreeNode*> rtrees = generateR(mid+1, r);
            for (auto l: ltrees) {
                for (auto r: rtrees) {
                    TreeNode* root = new TreeNode(mid);
                    root->left = l;
                    root->right = r;
                    ret.push_back(root);
                }
            }
        }
        return ret;
    }
    
    vector<TreeNode*> generateTrees(int n) {
        if (n<1) return vector<TreeNode*>{};
        return generateR(1, n);
    }

3] Validate Binary Search Tree

最基本的就是inorder了,但是這道正巧不允許重復。否則inorder無法detect duplicates' correctness(是嗎??如果recurse時檢查呢)

    void inorder(TreeNode* root, vector<int>& record) {
        if (root->left) inorder(root->left, record);
        record.push_back(root->val);
        if (root->right) inorder(root->right, record);
    }
    
    bool isValidBST(TreeNode* root) {
        if (!root) return true;
        vector<int> record;
        inorder(root, record);
        for (auto it=record.begin()+1; it<record.end(); ++it) {
            if (*it<=*(it-1)) return false;
        }
        return true;
    }

4] Convert Sorted Array to Binary Search Tree

careful not to be off by one

    TreeNode* sortedR(vector<int>& nums, int l, int r) {
        if (l>r) return nullptr;
        
        int mid = (l+r)/2;
        TreeNode* midn = new TreeNode(nums[mid]);
        midn->left = sortedR(nums, l, mid-1);
        midn->right = sortedR(nums, mid+1, r);
        return midn;
    }
    
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return sortedR(nums, 0, nums.size()-1);
    }

5] Convert Sorted List to Binary Search Tree

    TreeNode* sortedListToBST(ListNode* head) {
       if (!head) return nullptr;
       
       ListNode* prev = nullptr;
       ListNode* slow = head;
       for (ListNode *fast=head; fast->next&&fast->next->next; ) {
           prev = slow;
           slow = slow->next;
           fast = fast->next->next;
       }
       
       TreeNode* root = new TreeNode(slow->val);
       if (prev) {
           prev->next = nullptr;
           root->left = sortedListToBST(head);
       }
       if (slow->next) {
           root->right = sortedListToBST(slow->next);
       }
       
       return root;
    }
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容