import java.util.LinkedList;
import java.util.List;
/**
* Created by lxw, liwei4939@126.com on 2017/11/7.
* 统计和生成所有的不同的二叉树
* 给定一个整数N,N<1代表空树结构,否则代表中序遍历的结果,
* 返回可能的二叉树结构有多少种
*
* N含义不变,假设二叉树结构有M种,返回M个二叉树的头结点
*/
public class countAndGenerateBST {
public class Node{
public int value;
public Node left;
public Node right;
public Node(int data){
this.value = data;
this.left = null;
this.right = null
}
}
public int numTrees(int n){
if(n <2){
return 1;
}
int[] num = new int[n+1];
num[0] = 1;
for (int i=1; i< n+1; i++){
for (int j=1; j< i+1; j++){
num[i] += num[j-1] * num[i- j];
}
}
return num[n];
}
public List<Node> generateTrees(int n){
return generate(1, n);
}
public List<Node> generate(int start, int end){
List<Node> res = new LinkedList<Node>();
if(start > end){
res.add(null);
}
Node head = null;
for (int i=start; i< end +1; i++){
head = new Node(i);
List<Node> lSub = generate(start, i-1);
List<Node> rSub = generate(i+1, end);
for (Node l : lSub){
for (Node r : rSub){
head.left = l;
head.right = r;
res.add(cloneTree(head));
}
}
}
return res;
}
public Node cloneTree(Node head){
if(head == null){
return null;
}
Node res = new Node(head.value);
res.left = cloneTree(head.left);
res.right = cloneTree(head.right);
return res;
}
}
统计和生成所有的不同的二叉树
最新推荐文章于 2022-10-10 12:10:50 发布