题目:所有可能的满二叉树
class Solution {
public List<TreeNode> allPossibleFBT(int N) {
List<TreeNode> list = new ArrayList<>();
//N必须是奇数的,偶数无法构造满二叉树
if (N % 2 == 0){
return list;
}
//递归跳出条件,只有一个,不能再分了
if (N == 1)
{
ArrayList<TreeNode> down = new ArrayList<>();
down.add(new TreeNode(0));
return down;
}
/*
比如题目的N=7,那么可以分为
1、【1(左子树),1(头结点),5(右子树)】
2、【2(左子树),1(头结点),4(右子树)】
3、【3(左子树),1(头结点),3(右子树)】
4、【4(左子树),1(头结点),2(右子树)】
5、【5(左子树),1(头结点),1(右子树)】
但是,很明显第2、4种是不行的,因为出现了偶数,所以只有
1、【1(左子树),1(头结点),5(右子树)】
3、【3(左子树),1(头结点),3(右子树)】
5、【5(左子树),1(头结点),1(右子树)】
这时候你可能纳闷,只有3种,那答案为什么是5种呢?
其实,可以发现1、【1(左子树),1(头结点),5(右子树)】 与 5、【5(左子树),1(头结点),1(右子树)】
各有两种摆法,这时候又要重复上面的步骤了(递归) ---所以这题要用递归求解
*/
for (int i = 1; i < N; i++) {
List<TreeNode> list1 = allPossibleFBT(i);
List<TreeNode> list2 = allPossibleFBT(N - i - 1); //-1是因为要父结点留个位置
/*
如何理解这两个for呢?
比如说现在需要摆七个,并且我选择了 【1(左子树),1(头结点),5(右子树)】的摆法
其中5(右子树)有两种摆法。这两种摆法就加入了list2里头,然后list1只有一种摆法(因为只有一个)
然后对list1和list2里面的头结点进行排列组合即可(共两种)
*/
for (TreeNode left : list1) {
for (TreeNode right : list2) {
TreeNode father = new TreeNode(0);
father.left = left;
father.right = right;
list.add(father);
}
}
}
return list;
}
}