【问题标题】:What's time complexity of algorithm for finding all Unique Binary Search Trees?查找所有唯一二叉搜索树的算法的时间复杂度是多少?
【发布时间】:2014-07-07 19:11:57
【问题描述】:

唯一的二叉搜索树
给定 n,生成所有结构唯一的 存储值 1...n 的 BST(二叉搜索树)。

例如,给定n = 3,
你的程序应该返回所有 5 个唯一的 BST 如下所示。

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


个人认为
时间复杂度= O(n^n),n是输入。
但时间复杂度更紧是什么?
C++
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
#include <vector>
using namespace std;

class Solution {
public:
    vector<TreeNode *> generateTrees(int n) {
        vector<TreeNode *> list;

        // Input validation.
        if (n <= 0) {
            list.push_back(NULL);
            return list;
        }

        int left = 1;
        int right = n;
        generateTrees(left, right, list);

        return list;
    }

    void generateTrees(int left, int right, vector<TreeNode *> &list) {
        // Base case.
        if (left > right) {
            list.push_back(NULL);
            return;
        }

        for (int i = left; i <= right; i ++) {
            vector<TreeNode *> left_trees;
            generateTrees(left, i - 1, left_trees);

            vector<TreeNode *> right_trees;
            generateTrees(i + 1, right, right_trees);

            for (vector<TreeNode *>::iterator left_it = left_trees.begin();
                 left_it != left_trees.end(); left_it ++) {

                TreeNode *leftTree = *left_it;

                for (vector<TreeNode *>::iterator right_it = right_trees.begin();
                     right_it != right_trees.end(); right_it ++) {

                    TreeNode *rightTree = *right_it;

                    TreeNode *root = new TreeNode(i);
                    root->left = leftTree;
                    root->right = rightTree;

                    list.push_back(root);
                }         
            } 
        }
    }
};

【问题讨论】:

    标签: c++ algorithm recursion big-o binary-search-tree


    【解决方案1】:

    给定n个节点,二叉搜索树的总数是加泰罗尼亚数,请参考这个链接:http://en.wikipedia.org/wiki/Catalan_number。所以,时间复杂度也是O(Catalan(n))。

    【讨论】:

    • 谢谢dguan,wikipedia上的描述有点复杂,我需要一些时间考虑......
    • 其实你可以这样想问题:假设n个节点的BST数量为C(n),因为我们正在构建一个BST,对于每个根节点,可能有(0 - - 左子树中的 n-1) 个节点和右子树中的 (n-1 -- 0) 个节点,分别。所以 BST 的总数 C(n) = sum(C(i)*C(n-1-i)), i=0 -- n-1,正好是加泰罗尼亚数 Catalan( n).
    • Catalan(n) = C(n) = sum(C(i)*C(n-1-i)), i=0 -- n-1, 因为时间复杂度 = O (C(n)),所以时间复杂度 = O(Catalan(n))。所以接下来的问题是如何得到 Catalan(n),这才是真正难的部分。谢谢dguan。
    • 你可以直接使用递归公式得到C(n),效率非常低;或者使用动态规划,空间复杂度为O(n),时间复杂度为O(n^2),效率更高。
    • 是的dguan,但是我需要打印出所有的BST,所以我认为我必须使用递归。如果我只需要加泰罗尼亚语的数量,DP确实是个不错的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多