解题思路
根据真二叉树的定义:
1. 首先一颗满二叉树只能有2*i+1个节点
2. 满二叉树的左右子树也是满二叉树
3. 利用回溯算法的方式获取节点的左子树和右子树
4. 将长度为n的二叉树按照左右节点的个数情况进行拆分
示例代码
func allPossibleFBT(n int) []*TreeNode {
cache := []*TreeNode{}
if n%2 == 0 {
return cache
}
if n == 1 {
return append(cache, new(TreeNode))
}
for i := 1; i < n-1; i++ {
left := allPossibleFBT(i)
right := allPossibleFBT(n - i - 1)
for _, leftNode := range left {
for _, rightNode := range right {
root := new(TreeNode)
root.Val = 0
root.Left = leftNode
root.Right = rightNode
cache = append(cache, root)
}
}
}
return cache
}