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的思路,遍历中序位置,递归生成左子树的列表和右子树的列表,拼接起来加入列表。需要两个变量维护子树生成的范围,所以用辅助函数。

posted on 2022-01-12 16:58  阿ming  阅读(24)  评论(0编辑  收藏  举报

导航