2022-1-12二叉搜索树day3
题1:
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3 输出:5
示例 2:
输入:n = 1 输出:1
提示:
1 <= n <= 19
1 class Solution { 2 public int numTrees(int n) { 3 /** 4 递归太慢了,用数组记录再计算 5 if (n==0||n==1) return 1; 6 int ans=0; 7 for (int i=0;i<n;i++) { 8 ans+=numTrees(i)*numTrees(n-i-1); 9 } 10 return ans; 11 */ 12 13 int[] ans=new int[n+1]; 14 ans[0]=1; 15 int res=0; 16 for (int i=1;i<=n;i++) { 17 int temp=0; 18 for (int j=0;j<i;j++) { 19 temp+=ans[j]*ans[i-j-1]; 20 } 21 ans[i]=temp; 22 } 23 return ans[n]; 24 } 25 }
思路:相当于知道中序遍历,求树的数量。可以遍历中序的位置,左右子树转化为小问题递归或者动态规划。
题2:
给你一个整数 n
,请你生成并返回所有由 n
个节点组成且节点值从 1
到 n
互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例 1:
输入:n = 3 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例 2:
输入:n = 1 输出:[[1]]
提示:
1 <= n <= 8
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode() {} 8 * TreeNode(int val) { this.val = val; } 9 * TreeNode(int val, TreeNode left, TreeNode right) { 10 * this.val = val; 11 * this.left = left; 12 * this.right = right; 13 * } 14 * } 15 */ 16 class Solution { 17 public List<TreeNode> generateTrees(int n) { 18 return build(1,n); 19 } 20 21 public List<TreeNode> build(int l,int r){ 22 List<TreeNode> list=new ArrayList<>(); 23 if (l>r) list.add(null); 24 else { 25 for (int i=l;i<=r;i++) { 26 List<TreeNode> leftlist=build(l,i-1); 27 List<TreeNode> rightlist=build(i+1,r); 28 for (TreeNode left:leftlist){ 29 for (TreeNode right:rightlist){ 30 TreeNode root=new TreeNode(i); 31 root.left=left; 32 root.right=right; 33 list.add(root); 34 } 35 } 36 } 37 } 38 return list; 39 } 40 }
思路:按照题1的思路,遍历中序位置,递归生成左子树的列表和右子树的列表,拼接起来加入列表。需要两个变量维护子树生成的范围,所以用辅助函数。