题目描述:
给定一个整数 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]
]
上一题(Leetcode94.不同的二叉搜索树)是只用算出能生成的二叉树的个数而并不需要知道具体二叉树长什么样,而这道题是基于上一题的升级版,需要具体的求出不同的二叉树。
算法一:递归
求出所有树依然要同上一题一样,分别将 1 ~ n 的所有数作为根节点。
递归这个算法可以直接通过看代码理解具体解题思路,也最好理解,所以直接上代码吧。
public List<TreeNode> generateTrees(int n) { List<TreeNode> trees = new ArrayList<TreeNode>(); if (n == 0) { return trees;//没有节点则返回空树 } return getTrees(1, n); } private List<TreeNode> getTrees(int start, int end) { List<TreeNode> trees = new ArrayList<TreeNode>(); if (start > end) { trees.add(null); return trees; } //start=end说明只有一个节点,将这个节点作为一棵树加入 if (start == end) { TreeNode tree = new TreeNode(start); trees.add(tree); return trees; } //从i=start到end作为根节点 for (int i = start; i <= end; i++) { //得到所有左子树 List<TreeNode> leftTrees = getTrees(start, i - 1); //得到所有右子树 List<TreeNode> rightTrees = getTrees(i + 1, end); //用循环,将不同的左子树与右子树分别相组合 for (TreeNode leftTree : leftTrees) { for (TreeNode rightTree : rightTrees) { TreeNode root = new TreeNode(i); root.left = leftTree;
root.right = rightTree;
trees.add(root); } } } return trees; }
(^_^后续方法待更新...)