所有可能的滿二叉樹

滿二叉樹是一類二叉樹,其中每個結點恰好有 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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章