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

LeetCode-------unique-binary-search-trees-ii

时间:2017-12-14 04:06:52      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:问题   ural   nod   rally   递归调用   size   比较   new   treenode   

题目:

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 }

 

上面的解释比较枯燥,如果大家有什么问题可以联系我,我会详细把流程发给您们,邮箱:cmhhw_xju@163.com   qq:764666877
 
 
 
 
 
 

LeetCode-------unique-binary-search-trees-ii

标签:问题   ural   nod   rally   递归调用   size   比较   new   treenode   

原文地址:http://www.cnblogs.com/cmh-hw/p/8035225.html

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