程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> LeetCode_Unique Binary Search Trees II

LeetCode_Unique Binary Search Trees II

編輯:關於C++

一.題目

Unique Binary Search Trees II

Total Accepted: 32757 Total Submissions: 117071My Submissions

 

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

For example,
Given n = 3, your program should return all 5 unique BST's shown below.

   1         3     3      2      1
           /     /      /       
     3     2     1      1   3      2
    /     /                        
   2     1         2                 3

 

confused what {1,#,2,3} means? > read more on how binary tree is serialized on OJ.

 

Show Tags Have you met this question in a real interview? Yes No

Discuss












二.解題技巧

這道題和Unique Binary Search Trees很相似,只是這道題可能無法使用動態規劃減少計算的時間,因為每一個節點的值是不一樣的,不存在相同的子問題的情況,因此,計算復雜度無法下降。使用遞歸的方式進行的時候,時間復雜度為O(n^3),空間復雜度為O(n)。


三.實現代碼

#include 
#include 
#include 

using std::vector;
using std::unordered_map;


/**
* Definition for a binary tree node.
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/


struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};


class Solution
{
private:
    unordered_map > PreResult;

    vector generateTrees(int n, int base)
    {
        vector Result;

        if (n == 0)
        {
            TreeNode* TmpNode = NULL;
            Result.push_back(TmpNode);
            return Result;
        }

        if (n == 1)
        {
            TreeNode* TmpNode = new TreeNode(n + base);
            Result.push_back(TmpNode);
            return Result;
        }

        for (int HeadIndex = 1; HeadIndex <= n; HeadIndex++)
        {
            vector LeftChildVector = generateTrees(HeadIndex - 1, base);
            vector RightChildVector = generateTrees(n - HeadIndex, base + HeadIndex);

            const vector::size_type LEFTSIZE = LeftChildVector.size();
            const vector::size_type RIGHTSIZE = RightChildVector.size();

            for (vector::size_type IndexOfLeft = 0; IndexOfLeft < LEFTSIZE; IndexOfLeft++)
            {
                for (vector::size_type IndexOfRight = 0; IndexOfRight < RIGHTSIZE; IndexOfRight++)
                {
                    TreeNode *TmpHeadNode = new TreeNode(base + HeadIndex);
                    TmpHeadNode->left = LeftChildVector[IndexOfLeft];
                    TmpHeadNode->right = RightChildVector[IndexOfRight];

                    Result.push_back(TmpHeadNode);
                }
            }
        }

        return Result;

    }

public:
    vector generateTrees(int n)
    {
        return generateTrees(n, 0);
    }
};




四.體會

這道題也是一個和Unique Binary Search Trees類似的問題,解題思路也比較類似,只是這個的返回是所有可能的二叉查找樹,主要解答過程只是稍微修改下即可。


 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved