滿二叉樹是一類二叉樹,其中每個結點恰好有 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]]
解釋:
算法
首先偶數是不能構成滿二叉樹的。 思路是把總node數分別左邊,根,右邊進行遞歸,如7個node可以分成1,1,5;3,1,5;5,1,1(左,根,右)。 5個node又可以分爲1,1,3和3,1,1。 3個node又可以分爲1,1,1。 1個node直接返回。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<TreeNode> allPossibleFBT(int N) {
List<TreeNode> ans=new ArrayList<>();
//偶數節點是構成不了滿二叉樹的
if(N%2==0)return ans;
//將奇數節點分爲更小的節點
if(N==1){
TreeNode head=new TreeNode();
ans.add(head);
return ans;
}
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){
TreeNode head=new TreeNode();
head.left=l;
head.right=r;
ans.add(head);
}
}
}
return ans;
}
}