题目:
给你一个整数 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
}