给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
解题思路主要是因为节点数可以算说是固定的由1到n的自然数,这样可以分别对n个数进行排列,每个数化成一次根,当根固定后根据二叉搜索树的性质(左子树比根小,右子树比根大)自然就把1---i-1和i+1—n分成两类,前者在i为根的左边,后者在根的右边,再利用递归,再对左边进行排列,右边进行排列,相乘即可。得到i为根的排列树个数,再将所有的相加即可。
/*class Solution {
public:
int numTrees(int n) {
return total(1,n);
}
int total(int min,int max){
int totalNode=0,left,right,i;
if(min==max)
return 1;
if(max-min==1)
return 2;
for(i=1;i<=max;i++){
left=i;
if(left!=1)
left=total(1,i-1);
if(i!=max)
right=total(i+1,max);
else
right=1;
totalNode=totalNode+left*right;
}
return totalNode;
}
};*/
这代码写出来后在力扣上无法运行主要是因为栈堆内存溢出,对于求解所用的变量和数据太多。为此看完答案后可以建立一个数组,存储每一次n个序列的二叉搜索树个数,n为1或0时个数为1,其他可以用保存后其他个数可以用循环求出
class Solution {
public:
int numTrees(int n) {
vector<int> G(n + 1, 0);
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];
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha-sou-suo-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。