LintCode 不同的二叉查找树
来源:互联网 发布:阿里云服务器域名 编辑:程序博客网 时间:2024/06/05 14:21
不同的二叉查找树
给出 n,问由 1…n 为节点组成的不同的二叉查找树有多少种?
给出n = 3,有5种不同形态的二叉查找树:
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \2 1 2 3
Solution:
对于该问题我们可以使用动态规划来求解。。对于动态规划问题我们需要确定问题的状态和状态转换方程。
首先我们来确定问题的状态:给定
因此,
当
当
当
以3根节点时。其它的节点1,2只能在左子树。及
3 / {1, 2}, 此时就转换成了{1,2}有多少种二叉树。因此,3为根节点时有2中不同的二叉树
以2为根节点时,节点3只能在右子树,节点1只能在左子树。及
2 / \ {1} {3}, 由于左子树只有一个节点因此只有1种,同样右子树也只有1中。因此2为根节点有1x1=1种。
以1为根节点时,节点{2,3}只能在右子树。及
1 \ {2,3}, 此时就变成{2,3}有多少种二叉树{2,3}=f(2)。因此1为根节点有2种。
因此有f(3) = 2 + 1 + 2 = 5种。
分析到这里状态转换方程应该很容易写出来了吧?!
对于
注意:边界条件f(0)=1
上述等式还可以继续进行优化,这里不再详细叙述。详见代码.
public class Solution { /** * @paramn n: An integer * @return: An integer */ public int numTrees(int n) { // write your code here int [] res = new int[n+1]; res[0] = 1; for (int i = 1; i <= n; ++i) { for (int j = i-1; j >= i/2; --j) { if (i%2==1 && j == i/2) res[i] += res[j] * res[i-j-1]; else res[i] += res[j] * res[i-j-1]*2; } } return res[n]; }}
0 0
- LintCode-不同的二叉查找树 II
- LintCode-不同的二叉查找树
- lintcode-不同的二叉查找树-163
- LintCode 不同的二叉查找树
- LintCode:不同的二叉查找树
- 不同的二叉查找树 II lintcode
- lintcode,不同的二叉查找树
- LintCode 163-不同的二叉查找树
- LintCode :不同的二叉查找树
- lintcode-不同的二叉查找树
- 不同的二叉查找树-LintCode
- 不同的二叉查找树 II -LintCode
- lintcode --不同的二叉查找树
- lintcode--不同的二叉查找树II
- lintcode:不同的二叉查找树
- LintCode:M-不同的二叉查找树个数
- LINTCODE——不同的二叉查找树
- LintCode -- 不同的二叉查找树(python-O(n)时间复杂度)
- 面试时如何做自我介绍
- 字符串学习
- Android_第三方登录使用详解
- 2015年12月8日记
- lambda表达式:构造器引用
- LintCode 不同的二叉查找树
- ccf 201509-4 高速公路
- alsa-lib的unable to create IPC shm instance问题的解决
- java中Inputstream,outputstream(字节输入输出流)
- 有关于__align(n)
- 高精度算法(超出范围的数值的计算)
- HDU 1081 To The Max DP
- Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define 解决
- 07_Java 多线程编程