题目:满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点。
返回包含 N 个结点的所有可能满二叉树的列表。 答案的每个元素都是一个可能树的根结点。
答案中每个树的每个结点都必须有 node.val=0。
你可以按任何顺序返回树的最终列表。
示例:
输入:7
输出:[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,null,null,0,0],[0,0,0,0,0,null,null,0,0]]
提示: 1 <= N <= 20
来源:力扣(LeetCode)。
思路:其实本体看起来复杂,但是经过我们的聪明的大脑仔细分析之后,便可将问题简单化;
首先分析问题可知,N一定是1,3,5等数字,所以先排除所有偶数。
而后,我们假设F(N)是含有N个节点的所有可能的满二叉树集合,那么F(N)实际便等于F(X)(X从1到N-2,左子树)和F(N-X-1)(右子树)的集合,那么问题便迎刃而解。
class Solution {
public List<TreeNode> helper(List<TreeNode> list,int n){
if(n==1) {//截至条件
TreeNode t = new TreeNode(0);
t.left = null;
t.right = null;
list.add(t);
return list;
}
for(int i = 1;i<n;i=i+2) {//左右子树的递归
List<TreeNode> p1 = new ArrayList<TreeNode>();
List<TreeNode> p2 = new ArrayList<TreeNode>();
int j = n-i-1;
p1 = helper(p1,i);
p2 = helper(p2,j);
for(TreeNode t1:p1) {//左右子树的整合
for(TreeNode t2:p2) {
TreeNode temp = new TreeNode(0);
temp.left = t1;
temp.right = t2;
list.add(temp);
}
}
}
return list;
}
public List<TreeNode> allPossibleFBT(int N) {
if(N%2 == 0) {//判断
return new ArrayList<TreeNode>();
}
List<TreeNode> list = new ArrayList<TreeNode>();
if(N==1) {
TreeNode t = new TreeNode(0);
t.left = null;
t.right = null;
list.add(t);
return list;
}
helper(list,N);
return list;
}
}