Leetcode 894. 所有可能的真二叉树

182 阅读1分钟

题目地址

解题思路

根据真二叉树的定义:
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
}