题目链接
题目描述
给你一个整数 n ,请你找出所有可能含 n 个节点的 真二叉树 ,并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val == 0 。
答案的每个元素都是一棵真二叉树的根节点。你可以按 任意顺序 返回最终的真二叉树列表。
真二叉树 是一类二叉树,树中每个节点恰好有 0 或 2 个子节点。
示例 1:

输入:n = 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]]
示例 2:
输入:n = 3
输出:[[0,0,0]]
提示:
1 <= n <= 20
求解思路
- 分治递归:只有结点数为奇数才可以构成真二叉树,因此排除掉
n为偶数的情况。设置递归的边界:当n = 1的时候,只有一个结点,那么它自身就是一个孤立二叉树。因为只有结点数为奇数才可能构成,依次对左右分支进行递归,将得到的所有结果存入即为最终结果。
实现代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<TreeNode> allPossibleFBT(int n) {
List<TreeNode> fullBinaryTree = new ArrayList<TreeNode>();
if (n % 2 == 0) {
return fullBinaryTree;
}
if (n == 1) {
fullBinaryTree.add(new TreeNode(0));
return fullBinaryTree;
}
for (int i = 1; i < n; i += 2) {
List<TreeNode> left = allPossibleFBT(i);
List<TreeNode> right = allPossibleFBT(n - i - 1);
for (TreeNode l : left) {
for (TreeNode r : right) {
fullBinaryTree.add(new TreeNode(0, l , r));
}
}
}
return fullBinaryTree;
}
}
&spm=1001.2101.3001.5002&articleId=141122950&d=1&t=3&u=7ef9b22a8b154d11b161805a23d882b0)
391

被折叠的 条评论
为什么被折叠?



