96. 不同的二叉搜索树(leetcode)
较为困难的一道DP题,需要分析各个情况,以及想到如下思路:
给定一个有序序列 1⋯n,为了构建出一棵二叉搜索树,我们可以遍历每个数字 i,将该数字作为树根,将 1⋯(i−1) 序列作为左子树,将 (i+1)⋯n 序列作为右子树。接着我们可以按照同样的方式递归构建左子树和右子树。
需要想到以不同的数作为根节点得到的二叉搜索树,其递推方程为左子树种数*右子树种数这个难点,最后把不同的数作为根节点得到的结果求和
class Solution {
public int numTrees(int n) {
// dp[i]表示到1~i组成的节点有多少种不同的二叉搜索树
// dp[i] = dp[1~j-1] * dp[j~i];
int[] dp = new int[n+1];
dp[0]=1; // 为空也是一种二叉树
for (int i = 1; i <= n; i++) {
// 以多少为根节点来划分左右子树,划分子集
for (int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j]; // 左子树种数*右子树种数,即1~(j-1) 和 j~(i-j)
}
}
return dp[n];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!