95. 不同的二叉搜索树 II(来源LeetCode)
2018-12-18 09:33
441 查看
给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
示例:
输入: 3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
思路:确定一个i,以i为界,将序列分为两部分(左右子树),再采用递归的方法继续分左右子树,最后采用左右子树组合的方法生成全部二叉查找树。
代码如下:
import java.util.*; public class Solution95 { public static List<TreeNode> generateTrees(int n) { //判断n是否为0 // write your code here if(n==0){ List<TreeNode> R = new LinkedList<TreeNode>(); R.add(null); return R; } return generateTrees(1,n); } private static TreeNode copy(TreeNode Old){ //复制一个节点 if(Old==null) return null; TreeNode T = new TreeNode(Old.val); T.right = copy(Old.right); T.left = copy(Old.left); return T; } static List<TreeNode> generateTrees(int start, int last){ if(start>last) return null; List<TreeNode> result = new LinkedList<TreeNode>(); //树节点链表,包含众多左右子树 for(int i=start;i<=last;++i){ TreeNode root = new TreeNode(i); List<TreeNode> left = generateTrees(start,i-1); //生成左子树 List<TreeNode> right = generateTrees(i+1,last); //生成右子树 if(left==null&&right==null) //若左右子树为空,则将根节点添加到节点链表result result.add(root); else if(left==null){ //若左子树为空,将右子树添加到节点链表result for(TreeNode R:right){ root.right = R; result.add(copy(root)); } } else if(right==null){ //若右子树为空,将左子树添加到节点链表result for(TreeNode L:left){ root.left = L; result.add(copy(root)); } } else{ for(TreeNode L:left) //若左右子树均不为空,则将左右子树与跟节点进行组合 for(TreeNode R:right){ root.left = L; root.right = R; result.add(copy(root)); // 返回一颗树或者另一颗树的子树 } } } return result; } private static void printTree(TreeNode t){ //采用先序遍历的方式打印一棵树 if(t != null){ System.out.println(t.val); printTree(t.left); printTree(t.right); } } public static void main(String []args){ List<TreeNode> a = generateTrees(5); //a为树列表 for(int i = 0; i < a.size(); i++) { printTree(a.get(i)); System.out.println(); } } }
相关文章推荐
- LeetCode 95 Unique Binary Search Trees II
- [leetcode-95]Unique Binary Search Trees II(c++)
- leetcode95 Unique Binary Search Trees II
- LeetCode 95. Unique Binary Search Trees II(唯一二叉搜索树)
- LeetCode题库解答与分析——#63.不同路径IIUniquePathsII
- [LeetCode] Unique Paths II 不同的路径之二
- [leetcode 95] Unique Binary Search Trees II
- LeetCode(95) Unique Binary Search Trees II
- LeetCode95 Unique Binary Search Trees II
- leetcode95-Unique Binary Search Trees II(输出所有可能的BST)
- LeetCode(95) Unique Binary Search Trees II
- LeetCode 63.不同路径II
- leetCode 95.Unique Binary Search Trees II (唯一二叉搜索树) 解题思路和方法
- LeetCode题库解答与分析——#95. 不同的二叉查找树 IIUniqueBinarySearchTreeII
- leetcode[95] Unique Binary Search Trees II
- leetcode 第62题 不同路径, 第63题 不同路径 II, 第64题,最小路径和(python解法)
- LeetCode 95:Unique Binary Search Trees II
- Leetcode 95 Unique Binary Search Trees II
- [LeetCode]95 不同二分查找树之二
- [LeetCode95]Search in Rotated Sorted Array II