【题目】给定一个整数N,如果N<1,代表空树结构,否则代表中序遍历的结果为{1,2,3,…,N}.请返回可能的二叉树结构有多少。
public class NumTrees {
public static int numTree(int n) {
if (n < 2) {
return 1;
}
int[] dp = new int[n + 1];
dp[0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i + 1; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
}
【进阶】:N的含义不变,假设可能的二叉树结构有M种,请返回M个二叉树的头结点,每一棵二叉树代表一种可能的结构。
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
}
}
public static List<Node> generateTrees(int n) {
return generate(1, n);
}
public static List<Node> generate(int start, int end) {
List<Node> res = new LinkedList<>();
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;
}
private static 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;
}