95. Unique Binary Search Trees II
一、题目
1、审题
2、分析
给出数值 n, 输出由节点值为 1,2....n 所形成的所有二叉查找树。
二、解答
1、思路:
采用递归实现。
①、分别假设父结点为 1,2...i...n ,则左孩子为 1,2,..i-1, 右孩子为 i+1,i+2...n。
②、用列表 left 存储 左孩子的所有可能二叉树,用列表 right 存储右孩子的所有可能二叉树。最总将 left 拼接为 i 的左孩子,right 拼接为 i 的右孩子。
③、递归跳出条件为最左节点值 start > 最右节点值 end.
private List<TreeNode> genTrees(int start, int end) { List<TreeNode> list = new ArrayList<>(); if(start > end) { list.add(null); return list; } List<TreeNode> left, right; for (int i = start; i <= end; i++) { left = genTrees(start, i -1); // 左子树的所有结构 right = genTrees(i + 1, end); // 右子树的所有结构 for(TreeNode lnode: left) { for(TreeNode rnode: right) { TreeNode root = new TreeNode(i); // 左右子树与头结点拼接 root.left = lnode; root.right = rnode; list.add(root); } } } return list; }