Leetcode 96.不同的搜索二叉树
2024-09-01 07:27:39
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
这道题仔细想其实很简单的。首先我们先得明白什么是二叉搜索树,二叉搜索树又称二叉查找树,二叉排序树,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,
则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 解决这道题用两个函数:
1. G(n); 表示给定整数n的二叉搜索树的长度。其中G(0)=G(1)=1;
2. F(i,n); 表示以i为根节点,数列长度为n的数列能构成不同二叉树的个数; 因为一个数列,如果它的根节点确定了,那么能构成它的不同二叉搜索树的左右节点个数也就确定了。G(n)= F(1,n)+F(2,n)+...+F(n,n)。例如求G(8),其中一个以3为根节点的数列其左子树数为G(3-1);右子树数为4,5,6,7,8,
右子树的算法情况与1,2,3,4,5是一样的,所以右子树个数为G(n-3),可得F(i,n)=G(i-1)*G(n-i);所以G(n)=G(0)*G(n-1)+...+G(n-1)*G(0);由此可看出其实这个G(n)就是卡特兰数,关于卡特兰数具体特点,如果不太了解
可以搜索研究一下 。所以有两个算法。
算法一:动态规则
public class Solution {
public int numTrees(int n) {
int[] G = new int[n + 1];
G[0] = 1;
G[1] = 1; for (int i = 2; i <= n; ++i) {
for (int j = 1; j <= i; ++j) {
G[i] += G[j - 1] * G[i - j];
}
}
return G[n];
}
}
算法二:利用数学公式
G(0)=G(1)=1; G(n+1)=2(2n+1)G(n)/(n+2)
class Solution {
public:
int numTrees(int n) {
long G = 1;
for(int i = 0; i < n; i++)
G= G * 2 * (2 * i + 1) /(i + 2);
return G;
}
};
最新文章
- MySQL5.7 error log时间显示问题
- WebForm Repeater Response以及 地址栏
- 8.openssl req
- 减小服务器负担,Apache启用mod_expires模块
- Linq------各种查询语句大全
- 字符集与编码01--charset vs encoding
- PPP模式下的融资结构优化
- PHPExcel 是用来操作Office Excel 文档的一个PHP类库
- SGU107——987654321 problem
- VS2010中更改项目名称(转载)
- 认识CLR [《CLR via C#》读书笔记]
- C++的拷贝构造函数、operator=运算符重载,深拷贝和浅拷贝、explicit关键字
- leetcode — path-sum-ii
- iptables限制连接数(如sftp) 以及 谨防CC/DDOS攻击的配置 ( connlimit模块)
- Educational Codeforces Round 23 B. Makes And The Product
- 字节顺序:高位优先(big-endian)和低位优先(little-endian)
- Java8学习笔记(六)--Optional
- python学习 day1 (3月1日)
- 【LOJ】#2079. 「JSOI2016」轻重路径
- .net面试题[转载]