这篇page是针对leetcode上的96.不同的二叉搜索树所写的。小尼先简单的说明一下这道题的意思,给出一个整数n,求恰由n个节点组成且节点从1到n互不相同的二叉搜索树有多少种。
首先小尼先给各位小伙伴们回顾一下什么是二叉搜索树,二叉搜索树就是在这个二叉搜索树中不论是哪一个部分一定都是左子树的权值大于中间节点的权值大于右子树中的权值,一点是二叉树中的每一个部分都一定是这样,小尼先简单的跟大家分析一下这道理的解法:
首先小尼先说明一下dp[i]的含义,含义就是i个节点时可以构成的二叉搜索树的个数;然后我们再分析递推公式,这里的递推公式小尼再图中已经做出了对应的解释,因为我们需要符合二叉搜索树的定义,并且我们二叉搜索树多样的根本原因就是我们的中间节点的多样性,而且再我们每一个小二叉树中的中间节点都是有区别的,都是多样的,所以我们在这里就取了一个dp数组进行对应的记录我们的每一个j数值的对应的组合的个数,就是dp[j-1] * dp[i-j],对应的就是左子树可以组成的个数去乘以右子树可以组成的个数,我们会设定一个for循环进行不断地记录,随后循环到了我们的值的时候我们再可以利用前面的记录了的dp的数据进行最后结果的求解,小尼先拉一下代码:
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];
}
}
其实这道题跟小尼上一道所写的题目类似,我们一共写了两层for循环进行遍历,我们的第一层for循环是专门来记录我们的dp的值的,我们的第二层for循环是不断地放入我们可以放入的中间值的,所以我们for从1开始进行对应的遍历,并且我们的G[i]进行一个累加的操作,最后我们返回我们的G[n]的值。
希望可以跟小伙伴们带来帮助~~~