码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 96 不同的二叉树

时间:2020-02-01 13:02:07      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:ret   问题   计算   规划   分解   长度   new   有序   不同   

本问题可以用动态规划求解。

给定一个有序序列 1 ... n,为了根据序列构建一棵二叉搜索树。我们可以遍历每个数字 i,将该数字作为树根,1 ... (i-1) 序列将成为左子树,(i+1) ... n 序列将成为右子树。于是,我们可以递归地从子序列构建子树。
在上述方法中,由于根各自不同,每棵二叉树都保证是独特的。

可见,问题可以分解成规模较小的子问题。因此,我们可以存储并复用子问题的解,而不是递归的(也重复的)解决这些子问题,这就是动态规划法。

算法

问题是计算不同二叉搜索树的个数。为此,我们可以定义两个函数:

G(n): 长度为n的序列的不同二叉搜索树个数。
F(i,n): 以i为根的不同二叉搜索树个数

 public 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];
}
}

leetcode 96 不同的二叉树

标签:ret   问题   计算   规划   分解   长度   new   有序   不同   

原文地址:https://www.cnblogs.com/wqali/p/12248026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!