Leetcode 96. 不同的二叉搜索树(简单) 95. 不同的二叉搜索树II(中等)

思路:labuladong

 

96. 不同的二叉搜索树(简单)

题目:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:
* 输入:n = 3
* 输出:5
 
* 示例 2:
* 输入:n = 1
* 输出:1
 
思路:
可以使用递归的思想,选定i为根节点后,可能性就是count(low,i-1)*count(i+1,high)。那么遍历1-n,累加所有可能性即可
这里遍历时,会存在重复递归的问题,因此可以使用mem[n+1][n+1]记录count值
 
class Solution {
public:
    int numTrees(int n) {
        mem=vector<vector<int>>(n+1,vector<int>(n+1,0));
        return count(1,n);
    }
    int count(int lo, int hi){
        if(lo>hi) return 1;
        if(mem[lo][hi]!=0) return mem[lo][hi];
        int ret=0;
        for(int i=lo;i<=hi;++i){
            int left=count(lo,i-1);
            int right=count(i+1,hi);
            ret+=left*right;        
        }
        mem[lo][hi]=ret;
        return ret;
    }
    vector<vector<int>> mem;
};

 

95. 不同的二叉搜索树II(中等)

题目:

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例 1:
* 输入:n = 3
* 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
 
* 示例 2:
* 输入:n = 1
* 输出:[[1]]
 
思路:
递归遍历所有可能性,当lo>hi时,只有null一种可能性,build(lo,hi)就返回了所有可能构建的根节点数组
所以遍历i=lo;i<=hi,然后得到build(lo,i-1)与build(i+1,hi)的数组后,遍历组合即可。
 
class Solution {
public:
    vector<TreeNode*> generateTrees(int n) {
        if(n==0) return vector<TreeNode*>();
        return build(1,n);
    }
    vector<TreeNode*> build(int lo,int hi){
        vector<TreeNode*> ret;
        if(lo>hi){
            ret.push_back(nullptr);
            return ret;
        } 
        for(int i=lo;i<=hi;++i){
            vector<TreeNode*> left=build(lo,i-1);
            vector<TreeNode*> right=build(i+1,hi);
            for(int j=0;j<left.size();++j){
                for(int k=0;k<right.size();++k){
                    TreeNode* root=new TreeNode(i);
                    root->left=left[j];
                    root->right=right[k];
                    ret.push_back(root);
                }
            }
        }
        return ret;
    }
};

 

posted @ 2022-02-10 16:44  鸭子船长  阅读(45)  评论(0编辑  收藏  举报