Unique Binary Search Trees II 输出二叉树的所有组合@LeetCode
来源:互联网 发布:免费域名com申请 编辑:程序博客网 时间:2024/06/05 04:23
总结一点,要求出所有组合的问题,一般用dfs;如果要求总数,用dp。
另外,这道题的思路就是对1..n中的每一个数都依次让它做root,然后分出左右区间,再递归求解。最后把左右区间求得的子结果依次分别作为root的左右孩子,因此总共要3次循环。
还有值得注意的技巧是,当begin>end时,要往ret AL里面添加null,使得每个AL里面至少有一个元素(null)。这样可以避免判断只有左区间或只有右区间的情况。
package Level4;import java.util.ArrayList;import Utility.TreeNode;/** * Unique Binary Search Trees II * * 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 3confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ. */public class S95 {public static void main(String[] args) {ArrayList<TreeNode> ret = generateTrees(3);for (TreeNode treeNode : ret) {treeNode.print();System.out.println();}}public static ArrayList<TreeNode> generateTrees(int n) {return dfs(0, n-1);}public static ArrayList<TreeNode> dfs(int begin, int end){ArrayList<TreeNode> ret = new ArrayList<TreeNode>();if(begin > end){ret.add(null);// 相当于占位符return ret;}for(int i=begin; i<=end; i++){ArrayList<TreeNode> left = dfs(begin, i-1);// left和right至少会有一个元素null!ArrayList<TreeNode> right = dfs(i+1, end);for(int j=0; j<left.size(); j++){// 因为size至少为1,所以左右都会被访问到for(int k=0; k<right.size(); k++){TreeNode root = new TreeNode(i+1);// root node, i+1 因为第一个从1而不是从0开始root.left = left.get(j);root.right = right.get(k);ret.add(root);}}}return ret;}}
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; left = null; right = null; } * } */public class Solution { public List<TreeNode> generateTrees(int n) { return getTree(1, n); } public List<TreeNode> getTree(int left, int right) { List<TreeNode> list = new ArrayList<TreeNode>(); if(left > right) { list.add(null); return list; } for(int i=left; i<=right; i++) { List<TreeNode> leftList = getTree(left, i-1); List<TreeNode> rightList = getTree(i+1, right); for(int j=0; j<leftList.size(); j++) { for(int k=0; k<rightList.size(); k++) { TreeNode root = new TreeNode(i); list.add(root); root.left = leftList.get(j); root.right = rightList.get(k); } } } return list; }}
1 0
- Unique Binary Search Trees II 输出二叉树的所有组合@LeetCode
- LeetCode 95. Unique Binary Search Trees II&96. Unique Binary Search Trees--动态规划,二叉树
- [LeetCode]Unique Binary Search Trees II生成所有二叉搜索树
- LeetCode-95-Unique Binary Search Trees II 二叉树
- leetcode 95. Unique Binary Search Trees II 递归构造所有可能的搜索二叉树BST + 卡特兰数
- Unique Binary Search Trees II 二叉查找树的路径
- Unique Binary Search Trees II 二叉树的种类
- LeetCode OJ 之 Unique Binary Search Trees II (不同的二叉搜索树 - 二)
- 【LeetCode】Unique Binary Search Trees 二叉查找树的个数
- leetcode95-Unique Binary Search Trees II(输出所有可能的BST)
- 生成所有可能的二叉排序树 Unique Binary Search Trees II
- LeetCode | Unique Binary Search Trees II(构建二叉搜索树)
- leetCode 95.Unique Binary Search Trees II (唯一二叉搜索树) 解题思路和方法
- LeetCode 95. Unique Binary Search Trees II(唯一二叉搜索树)
- Leetcode 95. Unique Binary Search Trees II 二叉搜索树2 解题报告
- Leetcode 95. Unique Binary Search Trees II及二叉树最大最小深度镜像树总结
- LeetCode: Unique Binary Search Trees II
- LeetCode : Unique Binary Search Trees II
- Maximum Depth of Binary Tree
- 写给程序员:我们这一代不是汽车工人
- 黑马程序员-Java面向对象4
- 如何向 Oracle 表中的 Date 字段插入日期及时间
- [LeetCode] - Same Tree
- Unique Binary Search Trees II 输出二叉树的所有组合@LeetCode
- 使用Semaphore和Mutex实现Readers-writer lock (favor writer)【STM32\RT-Thread\读写锁】
- 矩阵求导
- 问题
- LeetCode题解:Implement strStr()
- 为一位大三同学的学习之路点评一二
- 关于使用sigsuspend(sigset_t* mask)阻塞进程
- php Array Usage
- php header头信息 举例