面试热题(不同的二分搜索树)

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

经典的面试题,这部分涉及了组合数学中的卡特兰数,如果对其不清楚的同学可以去看我以前的博客卡特兰数

今天用记忆化搜索以及动态规划进行讲解

  • 记忆化搜索
java 复制代码
    //维护一个记忆化搜素
    int[][] memo;
    public int numTrees(int n) {
     memo=new int[n+1][n+1];
    return  count(1,n);
    }
    public int count(int left,int right){
        //单节点,直接返回1
        if(left>=right){
            return 1;
        }
        if(memo[left][right]!=0){
            return memo[left][right];
        }
        int res=0;
        //遍历区间内的每一个节点,都作为根节点的情况
        for(int mid=left;mid<=right;mid++){
            int l=count(left,mid-1);
            int r=count(mid+1,right);
            res+=l*r;
        }
        memo[left][right]=res;
        return res;
    }
  • 动态规划
java 复制代码
   public int numTrees(int n) {
    //先创建一个存储的数组
     int[] dp=new int[n+1];
     dp[0]=1;
        //节点可能存储的位置
        for (int i =1; i <=n; i++) {
            //左边节点可能存储的个数
            for (int j = 0; j<i; j++) {
                //计算出总种类  dp[j]是左树的节点个数 dp[i-j-1]是右树的节点个数
                dp[i]+=dp[j]*dp[i-j-1];
            }
        }
     return dp[n];
        }
相关推荐
星火开发设计几秒前
命名空间 namespace:解决命名冲突的利器
c语言·开发语言·c++·学习·算法·知识
知无不研6 分钟前
选择排序算法
数据结构·算法·排序算法·选择排序
好学且牛逼的马6 分钟前
【Hot100|21-LeetCode 160. 相交链表】
算法·leetcode
爱学习的阿磊6 分钟前
C++中的策略模式应用
开发语言·c++·算法
郝学胜-神的一滴7 分钟前
Python中的bisect模块:优雅处理有序序列的艺术
开发语言·数据结构·python·程序人生·算法
筵陌9 分钟前
算法:位运算
算法
Christo315 分钟前
TKDE-2026《Efficient Co-Clustering via Bipartite Graph Factorization》
人工智能·算法·机器学习·数据挖掘
2401_8384725115 分钟前
C++异常处理最佳实践
开发语言·c++·算法
m0_7369191019 分钟前
C++中的类型标签分发
开发语言·c++·算法
2301_7903009626 分钟前
C++与微服务架构
开发语言·c++·算法