leetcode 894 所有可能的满二叉树
解题思路:令 F(N)作为所有含 N 个结点的可能的满二叉树的列表。
每个满二叉树 T含有 3 个或更多结点,在其根结点处有 2 个子结点。这些子结点 left 和 right 本身就是满二叉树。
因此,对于 N≥3,我们可以设定如下的递归策略:F(N) = [对于所有的 x,所有的树的左子结点来自 F(x) ,而右子结点来自F(N−1−x)]。
此外,通过简单的计数参数,没有满二叉树具有正偶数个结点。
最后,我们应该缓存函数F之前的结果,这样我们就不必在递归中重新计算它们。
Class Solution{
Map<Integer,List<TreeNode>> map = new HashMap<>();
public List<TreeNode> allPossibleFBT(int N) {
if(!map.containsKey(N)){
List<TreeNode> list = new ArrayList<>();
if(N==1){
list.add(new TreeNode(0));
}else if(N%2 == 1){
for(int x = 0;x<N;++x){//x为左子树结点数
int y = N-1-x;//y是右子树结点数
for(TreeNode left : allPossibleFBT(x)){
for(TreeNode right : allPossibleFBT(y)){
TreeNode t = new TreeNode(0);
t.left = left;
t.right = right;
list.add(t);
}
}
}
}
map.put(N,list);
}
return map.get(N);
}
}