给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
二叉搜索树又称为二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
- 若它的左子树不为空,则左子树上所有结点的值都小于根结点的值。
- 若它的右子树不为空,则右子树上所有结点的值都大于根结点的值。
- 它的左右子树也分别是二叉搜索树。
/**
* 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) {
return build(1,n);
}
List<TreeNode> build(int low, int high){
List<TreeNode> list = new ArrayList();
//空树
if(low > high){
list.add(null);
return list;
}
for(int i=low;i<= high; i++){
//构建左右子树
List<TreeNode> left = build(low, i-1);
List<TreeNode> right = build(i+ 1, high);
//循环构建
for(TreeNode leftNode: left){
for(TreeNode rightNode: right){
TreeNode root = new TreeNode(i);
root.left = leftNode;
root.right = rightNode;
list.add(root);
}
}
}
return list;
}
}