题目原型:
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
confused what "{1,#,2,3}" means? >
read more on how binary tree is serialized on OJ.
基本思路:
这题和第一个题的思路如出一辙,将某个数作为根节点,然后前面的数作为左子树,后面的作为右子树,在左子树集合中选出一种,再从右子树集合中选出一种,与根一起构成BST。
public ArrayList<TreeNode> generateTrees(int n)
{
return createTree(1, n);
}
//将某个数作为跟节点,然后前面的数作为左子树,后面的作为右子树
public ArrayList<TreeNode> createTree(int start,int end)
{
ArrayList<TreeNode> rs = new ArrayList<TreeNode>();
if(start>end)
{
rs.add(null);
return rs;
}
for(int rootNum = start;rootNum<=end;rootNum++)
{
ArrayList<TreeNode> left = createTree(start,rootNum-1);
ArrayList<TreeNode> right = createTree(rootNum+1, end);
for(int i = 0;i<left.size();i++)
{
for(int j = 0;j<right.size();j++)
{
TreeNode root = new TreeNode(rootNum);
root.left = left.get(i);
root.right = right.get(j);
rs.add(root);
}
}
}
return rs;
}
public ArrayList<TreeNode> generateTrees(int n)
{
ArrayList<ArrayList<TreeNode>> rs = new ArrayList<ArrayList<TreeNode>>();
for(int i = 1;i<=n;i++)
{
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
if(i==1)
{
TreeNode root = new TreeNode(i);
list.add(root);
rs.add(list);
}
else
{
list = insertNode(rs.get(i-2), new TreeNode(i));
rs.add(list);
}
}
return rs.get(n-1);
}
//将某个大于树中所有节点的值的节点插入一个树中
public ArrayList<TreeNode> insertNode(ArrayList<TreeNode> list, TreeNode node)
{
ArrayList<TreeNode> rs = new ArrayList<TreeNode>();
for(int i = 0;i<list.size();i++)
{
int count = 0;
int index = count+1;
TreeNode root = list.get(i);
TreeNode ro = copyTree(root);
TreeNode p = ro;
TreeNode next;
while(p.right!=null)
{
if(index>count)
{
next = p.right;
p.right = node;
node.left = next;
rs.add(ro);
ro = copyTree(root);
count++;
index=1;
}
else
{
p = p.right;
index++;
}
}
p.right = node;
rs.add(ro);
//增加n作为头节点
ro = copyTree(root);
node.left = ro;
ro = node;
rs.add(ro);
}
return rs;
}
//copy一棵树
public TreeNode copyTree(TreeNode root)
{
if(root==null)
return null;
else
{
TreeNode ro = new TreeNode(root.val);
ro.left = copyTree(root.left);
ro.right = copyTree(root.right);
return ro;
}
}
Unique Binary Search Trees II,布布扣,bubuko.com
原文:http://blog.csdn.net/cow__sky/article/details/22086941