LeetCode 95. 不同的二叉搜索树 II

给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。

示例:

输入: 3
输出:
[
  [1,null,3,2],
  [3,2,null,1],
  [3,1,null,null,2],
  [2,1,3],
  [1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:

算法:我们从1到n进行遍历,每次以这之中的某个点作为根结点,然后递归创建左子树与右子树。时间复杂度满足卡特兰数(C(n,2n)/n+1)。

/**
 * 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:
   
    vector<TreeNode*> dfs(int l, int r){
        vector<TreeNode*>res;
        if(l>r){
            res.push_back(NULL);
            return res;
        }
        for(int i=l;i<=r;i++){
            auto left=dfs(l,i-1);
            auto right=dfs(i+1,r);
            for(auto &lc:left)
                for(auto &rc:right){
                    TreeNode* root=new TreeNode(i);
                    root->left=lc;
                    root->right=rc;
                    res.push_back(root);
                }
        }
        return res;
    }
    vector<TreeNode*> generateTrees(int n) {
        if(!n)return {};
        return dfs(1,n);
    }
};

 

posted @ 2019-07-10 21:31  YF-1994  阅读(176)  评论(0编辑  收藏  举报