标签:++ 整数 == 左右 etc tree 题目 代码 输出
题目
给定一个整数 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] ]
解释: 以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3
思路
使用递归方法进行解题,调用 generateTrees(int star,int end) 方法在范围内遍历可作为根节点的数,并将初始范围划分为左右两部分,再继续调用 generateTrees(int star,int end) 方法。
最后将返回的左右子树拼接在根节点上,最终得到所有的二叉搜索树。
代码如下:
1 public class LeetCode_95 { 2 3 public class TreeNode { 4 int val; 5 TreeNode left; 6 TreeNode right; 7 TreeNode() {} 8 TreeNode(int val) { this.val = val; } 9 TreeNode(int val, TreeNode left, TreeNode right) { 10 this.val = val; 11 this.left = left; 12 this.right = right; 13 } 14 } 15 16 public List<TreeNode> generateTrees(int n) { 17 18 List<TreeNode> re = new ArrayList<LeetCode_95.TreeNode>(); 19 20 if(n==0) return re; 21 22 re = generateTrees(1,n); 23 24 return re; 25 } 26 27 28 public List<TreeNode> generateTrees(int star,int end){ 29 30 List<TreeNode> re = new ArrayList<LeetCode_95.TreeNode>(); 31 32 if(star>end) re.add(null); 33 34 for(int i=star;i<=end;i++){ 35 36 List<TreeNode> leftTrees = generateTrees(star, i-1); // 获取所有左子树 37 38 List<TreeNode> rightTrees = generateTrees(i+1, end); // 获取所有右子树 39 40 for (TreeNode left : leftTrees) { // 遍历左右子树,将其拼接在跟节点上 41 for (TreeNode right : rightTrees) { 42 TreeNode currTree = new TreeNode(i); 43 currTree.left = left; 44 currTree.right = right; 45 re.add(currTree); 46 } 47 } 48 49 50 } 51 52 return re; 53 } 54 55 }
标签:++ 整数 == 左右 etc tree 题目 代码 输出
原文地址:https://www.cnblogs.com/moxie-/p/13353928.html