Unique Binary Search Trees II

来源:互联网 发布:syslog 514端口 编辑:程序博客网 时间:2024/04/30 04:01

题目原型:

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;}

然后我想了另一种方法,如果我们得出了n-1的BST集合list,那么我们遍历list,把n节点插入此树中,由于n节点的值是最大的,所以它只可能插在某棵树的根或者右子树中。代码如下,可能写的比较复杂,仅作参考。

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;}}




0 0
原创粉丝点击