894. All Possible Full Binary Trees

similar to 95(construct BST), 96

DFS+MEMO

T: O(2^n)
/**
 * 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) {
        if (n % 2 == 0) {
            return new LinkedList<>();
        }
        LinkedList<TreeNode>[] memo = new LinkedList[n+1];
        return dfs(n, memo);
    }
    private List<TreeNode> dfs(int n, LinkedList<TreeNode>[] memo) {
        LinkedList<TreeNode> list = new LinkedList<>();
        if (n == 1) {
            list.add(new TreeNode(0));
            return list; 
        }
        if (memo[n] != null) {
            return memo[n];
        }
        for (int i = 1; i < n; i+=2) {
            int j = n - i - 1;
            List<TreeNode> leftTree = dfs(i, memo);
            List<TreeNode> rightTree = dfs(j, memo);
            for (TreeNode left : leftTree) {
                for (TreeNode right : rightTree) {
                    TreeNode root = new TreeNode(0);
                    root.left = left;
                    root.right = right;
                    list.add(root);
                }
            }
        }
        return memo[n] = list;
    }
}

/**
odd number of nodes -> why?
ans: root + 0 or 2 children

so for left -> use i
       right -> n - i - 1(root)

so left and right are also odd number
odd + odd + root = odd number

so we can give i start with 1 and increase by 2, so...1, 3, 5...
in another side is n - odd - 1, so also odd - odd -1 = odd

base case is 1 node

          7

        root
          /\
  can be   
  1 5    3.   3.  5 1
    /\   1 1 11
    1 3 or 3 1    

there are common subproblem
so we can have a memo[n]

T: O(2^n)
 */

DP

recursion like this:

become to find dp[nodesNumber]

Last updated

Was this helpful?