力扣labuladong一刷day36天
一、96. 不同的二叉搜索樹
題目鏈接:https://leetcode.cn/problems/unique-binary-search-trees/
思路:這是一道典型的動態規劃題,從n=3來看 子樹有幾種形態 (0, 2)、(1, 1)、(2, 0)有規律可循,即為左子樹為0的種數*右子樹為2的種數 + 左子樹為1的種樹 * 右子樹為1的種樹 + 左子樹為2的種數 * 右子樹為0的種數。定義dp數組表示dp[i]為n=i時二叉搜索樹的種數,遞推公式dp[i]=dp[j]*dp[i-j-1] (i<=n, j < i),初始化dp[0]=1, dp[1]=1, dp[2]=2;
class Solution {public int numTrees(int n) {if (n == 1) return 1;int[] dp = new int[n+1];dp[0] = 1;dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {for (int j = 0; j < i; j++) {dp[i] += dp[j] * dp[i - j -1];}}return dp[n];}
}
二、95. 不同的二叉搜索樹 II
題目鏈接:https://leetcode.cn/problems/unique-binary-search-trees-ii/
思路:
class Solution {public List<TreeNode> generateTrees(int n) {if (n == 0) return new ArrayList<>();return build(1, n);}List<TreeNode> build(int lo, int hi) {List<TreeNode> res = new LinkedList<>();// base caseif (lo > hi) {res.add(null);return res;}// 1、窮舉 root 節點的所有可能。for (int i = lo; i <= hi; i++) {// 2、遞歸構造出左右子樹的所有有效 BST。List<TreeNode> leftTree = build(lo, i - 1);List<TreeNode> rightTree = build(i + 1, hi);// 3、給 root 節點窮舉所有左右子樹的組合。for (TreeNode left : leftTree) {for (TreeNode right : rightTree) {// i 作為根節點 root 的值TreeNode root = new TreeNode(i);root.left = left;root.right = right;res.add(root);}}}return res;}
}