题目:
Given n, generate all structurally unique BST‘s (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST‘s shown below.
1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3
题意:
这道题的大致意思就是给定n,对于1,2,3,4,....,n这n个数构建二叉搜索树,共能构建几个,而后将这n个数构成的二叉树的根节点的值输出。
前面我已经说过碰见二叉树我们第一个想到的就是递归,下面我首先解释一下这道题对n的取值,它的输出,鉴于篇幅问题,n取值为1,2,3
当n为1的时候,很明显输出为[1],
当n为2的时候,我们来看共可以构建几个二叉搜索树:
1 2
\ /
2 1
当n=2时共可以构建两颗二叉搜索树,此时按照题目要求输出为:[1,2].
当n=3时,按照题目举例,输出为[1,1,2,3,3]
以上就是这道题的大致题意,下面我将对大牛们关于这一题的解法进行详细讲解(没办法,水平没有达到一定地步,这一题没有解答出来)。
1 /* 2 下面我将就这段代码进行详细讲解: 3 假设此时n=3. 4 5 (1)开始执行getTrees(1,3)函数, 6 low = 1 high = 3 7 在经过两个if判断之后,我们开始执行下面的for循环(通过对代码的分析我们可以知道,在该函数开始执行时i就代表了我们的根节点), 8 9 执行第一次循环,i==1;left = getTrees(1,0) right = getTrees(2,3);在经过递归调用之后,left = [null], 10 11 开始递归调用getTrees函数求解right,分析可知,执行结束之后,right = [3,2], 12 13 返回i== 1时的情景,此时list= [1,1]. 14 同理可以得到i== 2时的情况以及i== 3时的情况, 15 16 另外我们注意当i== 1时,此时的二叉搜索树为:1 1 17 \ 18 2 3 19 \ / 20 3 2 21 22 */ 23 24 25 26 27 28 29 import java.util.*; 30 public class Solution { 31 public ArrayList<TreeNode> generateTrees(int n) { 32 return getTrees(1,n); 33 } 34 public ArrayList<TreeNode> getTrees(int low,int high) 35 { 36 ArrayList<TreeNode> list = new ArrayList<TreeNode>(); 37 if(low > high) 38 { 39 list.add(null); 40 return list; 41 } 42 if(low == high) 43 { 44 TreeNode node = new TreeNode(low); 45 list.add(node); 46 return list; 47 } 48 49 for(int i = low;i<=high;i++) 50 { 51 ArrayList<TreeNode> left = getTrees(low,i-1); 52 ArrayList<TreeNode> right = getTrees(i+1,high); 53 54 for(int j = 0;j<left.size();j++) 55 { 56 for(int k = 0;k<right.size();k++) 57 { 58 TreeNode node = new TreeNode(i); 59 node.left = left.get(j); 60 node.right = right.get(k); 61 list.add(node); 62 } 63 } 64 } 65 return list; 66 } 67 }