不同的二叉搜索树 II(中等)
题目描述
给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例1
输入:n = 3 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例2
输入:n = 1 输出:[[1]]
做题思路
1.二叉搜索树的一个重要特性:根节点的值大于左子树中所有节点的值,小于右子树中所有节点的值。 2.给定一个有序序列1…n,为构建出一棵二叉树,我们可以遍历每个数字i,将该数字作为树根,将1…(i-1)序列作为左子树,将(i+1)…n序列作为右子树,接着我们可以按照同样的方式递归构建左子树和右子树。然后我们遍历所有的左子树和右子树集合,将它们进行拼接,拼接后得到的二叉树添加进列表中,我们需要注意递归结束的条件为start>end。
代码
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public List<TreeNode> generateTrees(int n) { if(n==0){ return new LinkedList<TreeNode>(); } return generateTrees(1,n); } public List<TreeNode> generateTrees(int start,int end){ List<TreeNode> trees=new LinkedList<TreeNode>(); //递归结束条件 if(start>end){ trees.add(null); return trees; } for(int i=start;i<=end;i++){ //获得所有可行的左子树集合 List<TreeNode> leftTrees=generateTrees(start,i-1); //获得所有可行的右子树集合 List<TreeNode> rightTrees=generateTrees(i+1,end); //将左子树和右子树进行拼接 for(TreeNode left:leftTrees){ for(TreeNode right:rightTrees){ TreeNode cur=new TreeNode(i); cur.left=left; cur.right=right; trees.add(cur); } } } return trees; } }
上一篇:
IDEA上Java项目控制台中文乱码