解法一:递归
每一棵满二叉树的左右子树都是满二叉树。
用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);}}
