894. 所有可能的真二叉树

173 阅读1分钟

题目:
给你一个整数 n ,请你找出所有可能含 n 个节点的 真二叉树 ,并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val == 0 。

答案的每个元素都是一棵真二叉树的根节点。你可以按 任意顺序 返回最终的真二叉树列表

真二叉树 是一类二叉树,树中每个节点恰好有 0 或 2 个子节点。
算法:
方法一:分治+dfs

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func allPossibleFBT(n int) []*TreeNode {
    if n == 1 {
        return []*TreeNode{&TreeNode{}}
    } else if n % 2 == 0 {
        return nil
    }
    leftNum, rightNum := 1, n - 2

    ans := make([]*TreeNode, 0)     
    for rightNum > 0 {
        leftNodes := allPossibleFBT(leftNum)
        rightNodes := allPossibleFBT(rightNum)
        for i := range leftNodes {
            for j := range rightNodes {
                node := &TreeNode{}
                node.Left = leftNodes[i]
                node.Right = rightNodes[j]
                ans = append(ans, node)
            }
        }
        leftNum = leftNum + 2
        rightNum = rightNum - 2
    }    
    return ans
}