解法一:递归
每一棵满二叉树的左右子树都是满二叉树。
用Map保存子问题的解和对偶数情况做剪枝参考官方题解:https://leetcode-cn.com/problems/all-possible-full-binary-trees/solution/suo-you-ke-neng-de-man-er-cha-shu-by-leetcode/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Map<Integer, List<TreeNode>> map = new HashMap<>();
public List<TreeNode> allPossibleFBT(int N) {
if (!map.containsKey(N)) {
List<TreeNode> list = new LinkedList<>();
if (N == 1) {
TreeNode root = new TreeNode(0);
list.add(root);
} else if (N % 2 == 1) {
for (int x = 0; x <= N - 1; ++x) {
int y = N - 1 - x;
for (TreeNode left : allPossibleFBT(x)) {
for (TreeNode right : allPossibleFBT(y)) {
TreeNode root = new TreeNode(0);
root.left = left;
root.right = right;
list.add(root);
}
}
}
}
map.put(N, list);
}
return map.get(N);
}
}