问题:给定一个数n,生成n个节点,节点值分别为1,2,...,n,要求生成这n个节点的所有结构不同的二叉搜索树。
比如,给定一个数n=3,你的程序应该生成5个不同的BST,如下所示:
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
二叉树的结构如下:
//Definition for binary tree
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
解法:对于二叉树的许多问题都可以用递归进行解决。可以分析出,对于1...n中的任一个数i,有1,...,(i-1)等节点肯定位于i节点的左侧,(i+1),...,n等节点肯定位于i节点的右侧,如果能够把i节点的所有左侧分支树和右侧分支树的结构求出来,那所有以i节点为根的树的结构也就求出来了。很明显,使用递归可以完成。
public class Solution {
public List<TreeNode> generateTrees(int n) {
return genTrees(1,n);
}
public List<TreeNode> genTrees (int head, int tail){
List<TreeNode> list = new ArrayList<TreeNode>();
if(head>tail){
list.add(null);
return list;
}
for(int i=head; i<=tail; i++){
List<TreeNode> leftpart,rightpart;
leftpart = genTrees(head, i-1);
rightpart = genTrees(i+1, tail);
for(TreeNode lnode : leftpart){
for(TreeNode rnode : rightpart){
TreeNode node = new TreeNode(i);
node.left = lnode;
node.right = rnode;
list.add(node);
}
}
}
return list;
}
}