思路
n个节点中每个节点都可能当成根节点,除了根节点以外 有n - 1个节点 其实可以把n - 1分解: n - 1 = (n-1) + (0) (n为根节点)
n - 1 = (n - 2) + (1) (n-1为根节点)
....
n - 1 = (1) + (n - 2) (2为根节点)
n - 1 = (0) + (n - 1) (1为根节点)
左边代表左子树,右边代表右子树
解题过程
首先,创建dp数组 dp[n]含义: n个结点的二叉搜索树有几种形态;
其次,初始化dp数组, 如果空节点,那肯定一种情况,即 dp[0] = 0; 如果有一个节点,也是有一种情况 即dp[1] = 1; 如果两个节点可以由上述 dp[0] 和 dp[1] 推出,2个节点中的每一个节点都可以当成根节点,一共需要n次循环,因为除了根节点, 分别对应左孩子有 0 、1 个,而左孩子有0个、1个可以由dp[0]、dp[1]int numTrees(int n) { int* dp = (int*)malloc(sizeof(int)*(n+1)); if( n < 2){ return 1; } for(int i = 0; i <= n; ++i) dp[i] = 0; dp[0] = 1; dp[1] = 1; dp[2] = 2; for(int i = 3; i <= n; i++){ for(int j = 1; j <= i; j ++ ){ dp[i] += dp[j - 1] * dp[i -j]; } } return dp[n]; } 作者:睡个好觉 链接:https://leetcode.cn/problems/unique-binary-search-trees/solutions/3625701/dong-tai-gui-hua-by-charming-hofstadtern-kd70/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复杂度
- 时间复杂度: O(n^2)
- 空间复杂度: O(1)