坚持天天一道题,刷题学习Rust.
原题git
示例:github
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不一样结构的二叉搜索树:学习
1 3 3 2 1
/ / / 3 2 1 1 3 2
/ / 2 1 2 3code
思路:
搜索树的特色就是左小右大
所以:
这是一个纯计算的过程,都不用模拟二叉树
1...n
G[i]表示有i个节点的二叉树有多少种
G[N]=G[0]G[N-1]+G[1]G[N-2]+G[2]*[N-3]+....
考虑1作定点的状况主要考虑右边N-1个节点的各类组合怎么挂在1的右子树
考虑2作顶点的状况,左边是一个节点的子树,右边是n-2个节点的子树
两个总数相乘就是全部可能的组合.leetcode
struct Solution {} impl Solution { pub fn num_trees(n: i32) -> i32 { if n <= 1 { return n; } let mut v = vec![0; (n + 1) as usize]; v[0] = 1; v[1] = 1; return Solution::num_trees_internal(n as usize, &mut v); } pub fn num_trees_internal(n: usize, v: &mut Vec<i32>) -> i32 { if v[n] > 0 { return v[n]; } let mut sum = 0; for i in 0..n { v[i] = Solution::num_trees_internal(i, v); v[n - i - 1] = Solution::num_trees_internal(n - i - 1, v); sum += v[i] * v[n - i - 1]; } sum } } #[cfg(test)] mod test { use super::*; #[test] fn test_num_trees() { assert_eq!(1, Solution::num_trees(1)); assert_eq!(2, Solution::num_trees(2)); assert_eq!(5, Solution::num_trees(3)); } }
动态规划是自底向上,针对这种状况很是简单,记录下来,避免反复计算.get
欢迎关注个人github,本项目文章全部代码均可以找到.it