给你一个整数 n
,请你生成并返回所有由 n
个节点组成且节点值从 1
到 n
互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
我的思路:采用回溯法,递归生成所有左右二叉搜索子树,然后再穷举所有的情况
代码如下:
public class Solution { //二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; public List<TreeNode> generateTrees(int n) { if (n == 0){ return new LinkedList<>(); } return dfs(1, n); } public List<TreeNode> dfs(int start,int end){ List<TreeNode> res = new ArrayList<>(); if (start > end){ res.add(null); return res; } for (int mid = start; mid <= end; mid++) { List<TreeNode> left = dfs(start, mid - 1);//mid的左二叉搜索树的所有可能情况 List<TreeNode> right = dfs(mid + 1, end);//mid的右二叉搜索树的所有可能情况 for (TreeNode l : left) { for (TreeNode r : right) { TreeNode node = new TreeNode(mid); node.left = l; node.right = r; res.add(node); } }//穷举mid左右子树的所有可能情况 } return res; } }