leetCode 95.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 3
confused what "{1,#,2,3}"
means? >
read more on how binary tree is serialized on OJ.
思路:这一题尽管比較繁琐。可是难度不算非常大,能够运用排列组合的思想,全排列,然后查找符合要求的二叉搜索树就可以。
也能够运用递归,将数分为左右子树,进而简化求解。
排列组合思想代码例如以下(不知为什么OJ未通过,n=2时报错。但本地測试全然正确):
- /**
- * Definition for a binary tree node.
- * public class TreeNode {
- * int val;
- * TreeNode left;
- * TreeNode right;
- * TreeNode(int x) { val = x; }
- * }
- */
- public class Solution {
- boolean[] b;
- List<TreeNode> list;
- Set<String> set = new HashSet<String>();
- public List<TreeNode> generateTrees(int n) {
- b = new boolean[n];
- int[] a = new int[n];
- list = new ArrayList<TreeNode>();
- for(int i = 0; i < n; i++){
- a[i] = i+1;
- }
- create(a,null,n);
- return list;
- }
- /**
- * 生成二叉搜索树
- */
- private void create(int[] a,TreeNode root,int nn){
- if(nn == 0){
- TreeNode q = root;
- String s = preOrder(q, "");
- //System.out.println(s);
- if(set.add(s)){
- list.add(root);
- }
- return;
- }
- for(int i = 0; i < a.length; i++){
- if(!b[i]){
- b[i] = true;
- TreeNode p = new TreeNode(a[i]);
- root = insert(root,p);
- create(a,root,nn-1);
- root = delete(root,p);
- b[i] = false;
- }
- }
- }
- /**
- * 前序遍历
- * @param root
- * @param s
- * @return
- */
- private String preOrder(TreeNode root,String s){
- if(root != null){
- s += root.val;
- if(root.left != null){
- s = preOrder(root.left, s);
- }
- if(root.right != null){
- s = preOrder(root.right, s);
- }
- }
- return s;
- }
- /**
- * 删除节点
- * @param root
- * @param p
- * @return
- */
- private TreeNode delete(TreeNode root, TreeNode p) {
- if(root.val == p.val)
- return null;
- if(root.val < p.val){
- root.right = delete(root.right,p);
- }else{
- root.left = delete(root.left,p);
- }
- return root;
- }
- /**
- * 将新节点插入二叉搜索树
- */
- private TreeNode insert(TreeNode root,TreeNode node){
- TreeNode p = root;
- if(p == null){
- p = node;
- return p;
- }
- if(node.val < p.val){
- root.left = insert(p.left,node);
- }else{
- root.right = insert(p.right,node);
- }
- return root;
- }
- }
递归解法:
- /**
- * Definition for a binary tree node.
- * public class TreeNode {
- * int val;
- * TreeNode left;
- * TreeNode right;
- * TreeNode(int x) { val = x; }
- * }
- */
- public class Solution {
- public List<TreeNode> generateTrees(int n){
- List<TreeNode> list = new ArrayList<TreeNode>();
- if(n <= 0){
- list.add(null);
- return list;
- }
- list = createTree(1,n);
- return list;
- }
- /**
- * 循环生产二叉搜索树
- * @param i 開始值
- * @param j 结束值
- * @return
- */
- private List<TreeNode> createTree(int i, int j){
- List<TreeNode> list = new ArrayList<TreeNode>();
- //起始大于结束值,加入null
- if(i > j){
- list.add(null);
- return list;
- }
- //相等也即加入一个
- if(i == j){
- list.add(new TreeNode(i));
- return list;
- }
- //循环加入
- for(int k = i; k <= j; k++){
- //左子树肯定比i小
- List<TreeNode> left = createTree(i,k-1);
- //右子树肯定比i大
- List<TreeNode> right = createTree(k+1,j);
- //将结果循环加入
- for(TreeNode l:left){
- for(TreeNode r:right){
- TreeNode root = new TreeNode(k);
- root.left = l;
- root.right = r;
- list.add(root);
- }
- }
- }
- return list;
- }
- }
leetCode 95.Unique Binary Search Trees II (唯一二叉搜索树) 解题思路和方法的更多相关文章
- [LeetCode] 95. Unique Binary Search Trees II 唯一二叉搜索树 II
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- [LeetCode] 95. Unique Binary Search Trees II 独一无二的二叉搜索树之二
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...
- [Leetcode] Unique binary search trees ii 唯一二叉搜索树
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- [LeetCode] Unique Binary Search Trees II 独一无二的二叉搜索树之二
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- LeetCode OJ:Unique Binary Search Trees(唯一二叉搜索树)
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- 【LeetCode-面试算法经典-Java实现】【096-Unique Binary Search Trees(唯一二叉搜索树)】
[096-Unique Binary Search Trees(唯一二叉搜索树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given n, how many s ...
- [LeetCode] 95. Unique Binary Search Trees II(给定一个数字n,返回所有二叉搜索树) ☆☆☆
Unique Binary Search Trees II leetcode java [LeetCode]Unique Binary Search Trees II 异构二叉查找树II Unique ...
- [leetcode]95. Unique Binary Search Trees II给定节点形成不同BST的集合
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...
- leetcode 95 Unique Binary Search Trees II ----- java
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...
随机推荐
- 部署私有Docker Registry
安装部署一个私有的Docker Registry是引入.学习和使用Docker这门技术的必经之路之一.尤其是当Docker被所在组织接受,更多人.项目和产品开始接触和使用Docker时,存储和分发自制 ...
- 【CF1016C】Vasya And The Mushrooms(模拟)
题意:给定一个2*n的矩阵,每一个点有一个权值,从左上角出发,时间t=0开始,连续的走,将矩阵走完, 每走一步,t++,并且得到t*当前格子的权值的值,求最大的权值和 n<=3e5,1<= ...
- AtCoder Regular Contest 090 F - Number of Digits
题目链接 Description For a positive integer \(n\), let us define \(f(n)\) as the number of digits in bas ...
- hdu 3549 Flow Problem 最大流 Dinic
题目链接 题意 裸的最大流. 学习参考 http://www.cnblogs.com/SYCstudio/p/7260613.html Code #include <bits/stdc++.h& ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---20
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- 【linux高级程序设计】(第七章)终端及串口编程 未完成
一.端口设备类型 1.显示设备基本信息 cat /proc/tty/drivers 里面包括了: 当前终端:/dev/tty 前台控制台终端:/dev/console 用于创建虚拟终端的:/dev/p ...
- interview ms1 robert move **
move 2turn rightmove 3turn rightmove 6 初始位置为(0,0),方向为north,求最后的位置. string2char: const char* t = sec ...
- LeetCode OJ-- Jump Game
https://oj.leetcode.com/problems/jump-game/ 从0开始,根据每一位上存的数值往前跳. 这道题给想复杂了... 记录当前位置 pos,记录可以调到的最远达位置为 ...
- 用Gson解析没有数据头的纯数组json字符串
无数据头Json字符串 Json字符串只有数组,而次数组没有名字,如下 [ { "name": "zhangsan", "age": &qu ...
- TopCoder SRM 682 Div1 Problem 450 SuccessfulMerger (环套树 + 分类讨论)
题意 给定一个$n$个点$n$条边的无向图,现在要把这个图进行若干次操作,并选择一个点作为首都. 要求除首都外的任意两个点$u$, $v$,从$u$走到$v$必须经过这个首都. 操作为合并两个相邻的 ...