leetcode刷题记录 894 所有可能的满二叉树

leetcode 894 所有可能的满二叉树

在这里插入图片描述
解题思路:令 F(N)作为所有含 N 个结点的可能的满二叉树的列表。

每个满二叉树 T含有 3 个或更多结点,在其根结点处有 2 个子结点。这些子结点 left 和 right 本身就是满二叉树。

因此,对于 N≥3,我们可以设定如下的递归策略:F(N) = [对于所有的 x,所有的树的左子结点来自 F(x) ,而右子结点来自F(N−1−x)]。

此外,通过简单的计数参数,没有满二叉树具有正偶数个结点

最后,我们应该缓存函数F之前的结果,这样我们就不必在递归中重新计算它们。

Class Solution{
	Map<Integer,List<TreeNode>> map = new HashMap<>();
    public List<TreeNode> allPossibleFBT(int N) {
        if(!map.containsKey(N)){
          List<TreeNode> list = new ArrayList<>();
          if(N==1){
              list.add(new TreeNode(0));
          }else if(N%2 == 1){
              for(int x = 0;x<N;++x){//x为左子树结点数
                  int y = N-1-x;//y是右子树结点数
                  for(TreeNode left : allPossibleFBT(x)){
                      for(TreeNode right : allPossibleFBT(y)){
                          TreeNode t = new TreeNode(0);
                          t.left = left;
                          t.right = right;
                          list.add(t);
                      }
                  }
              }  
          }
          map.put(N,list);
        }
        return map.get(N);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值