【Leetcode】95.不同的二叉搜索树 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:
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 8
解答
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> allTrees = new LinkedList<TreeNode>(); if (start > end) { allTrees.add(null); return allTrees; } // 枚举可行根节点 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 currTree = new TreeNode(i); currTree.left = left; currTree.right = right; allTrees.add(currTree); } } } return allTrees; } }
思路
二叉树的性质:左子树小于根节点,右子数大于根节点。所以可以当每个数都当1次根节点,其他数排列组合成不同的组合即可。
但是这个组合的生成怎么去搞,其实还蛮重要的。因此把这道题目记录下来。
对于树的题目,第一选择永远是递归。这个是毋庸置疑的。
第二个是这个解法给我提供了构造树的思路,一开始我看到让我构造树我是懵逼的。后面再构造其他树其实也就好办了。
附原题链接 95. 不同的二叉搜索树 II
树林美丽、幽暗而深邃,但我有诺言尚待实现,还要奔行百里方可沉睡。 -- 罗伯特·弗罗斯特

浙公网安备 33010602011771号