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
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees (& II)
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- Unique Binary Search Trees II
- 不能访问特定网站
- -三角形类的构造函数
- Java编程中“为了性能”尽量要做到的一些地方
- Android WebRTC 音视频开发总结(二)
- 第二学期第五周项目1--三角形类的构造函数2
- Unique Binary Search Trees II
- 多线程编程中的EventWaitHandler
- Android WebRTC 音视频开发总结(二)
- u-boot环境变量的设置与使用 ttys与ttysac
- 新学期第一次活动
- 微信公众
- 这5种员工,千万不能重用
- HTML元素的一些基础东西,呵呵
- Mysql监控工具mycheckpoint