96. 不同的二叉搜索树

1|096. 不同的二叉搜索树

96. 不同的二叉搜索树

// [96. 不同的二叉搜索树](https://leetcode-cn.com/problems/unique-binary-search-trees/) // n个整数-> 每个整数都可以作为根节点 for(i: n)-> [1, i-1]左子树, [i+1,n]右子树 dp[1] = 1 // 递推公式直接就出来了 dp[i]表示 n=i时候可以构成的种数, dp[i] = dp[left] * dp[right], left(左子树节点数=i-1),right(右子树节点数n-i) // 比如 dp[3] = 根节点为1 + 根节点为2 + 根节点为3, 其中根节点为2时, dp[3] = dp[1] * dp[1] = 1 // 这样代码就很容易写出来了 class Solution { public int numTrees(int n) { int[] dp = new int[n + 1]; dp[0] = 1;//不管一个节点还是空子树都只有一种情况 dp[1] = 1; for (int i = 2; i <= n; i++) { for (int root = 1; root <= i; root++) { dp[i] += (dp[root - 1] * dp[i - root]); } } return dp[n]; } } // 优化, 由于种类数是对称的, 可以这样计算 for (int root = 1; root <= i/2; root ++) dp[i] += (dp[root - 1] * dp[i - root])*2; 奇数个数还需要补充左右子树个数一样的种类数 class Solution2 { public int numTrees(int n) { return 0; } } // 数学推导就是这样的 // G(n)=f(1)+f(2)+f(3)+f(4)+...+f(n) // f(i)=G(i−1)∗G(n−i) // G(n)=G(0)∗G(n−1)+G(1)∗(n−2)+...+G(n−1)∗G(0) ;卡特兰数

__EOF__

本文作者Rocky
本文链接https://www.cnblogs.com/nrocky/p/15972711.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   -Rocky-  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示