每天一道LeetCode题之所有可能的满二叉树

题目:所有可能的满二叉树

class Solution {

    public List<TreeNode> allPossibleFBT(int N) {
        List<TreeNode> list = new ArrayList<>();
        //N必须是奇数的,偶数无法构造满二叉树
        if (N % 2 == 0){
            return list;
        }

        //递归跳出条件,只有一个,不能再分了
        if (N == 1)
        {
            ArrayList<TreeNode> down = new ArrayList<>();
            down.add(new TreeNode(0));
            return down;
        }

        /*
        比如题目的N=7,那么可以分为
        1、【1(左子树),1(头结点),5(右子树)】
        2、【2(左子树),1(头结点),4(右子树)】
        3、【3(左子树),1(头结点),3(右子树)】
        4、【4(左子树),1(头结点),2(右子树)】
        5、【5(左子树),1(头结点),1(右子树)】
        但是,很明显第2、4种是不行的,因为出现了偶数,所以只有
        1、【1(左子树),1(头结点),5(右子树)】
        3、【3(左子树),1(头结点),3(右子树)】
        5、【5(左子树),1(头结点),1(右子树)】
        这时候你可能纳闷,只有3种,那答案为什么是5种呢?
        其实,可以发现1、【1(左子树),1(头结点),5(右子树)】 与 5、【5(左子树),1(头结点),1(右子树)】
        各有两种摆法,这时候又要重复上面的步骤了(递归) ---所以这题要用递归求解
         */
        for (int i = 1; i < N; i++) {
            List<TreeNode> list1 = allPossibleFBT(i);
            List<TreeNode> list2 = allPossibleFBT(N - i - 1); //-1是因为要父结点留个位置
            /*
            如何理解这两个for呢?
            比如说现在需要摆七个,并且我选择了 【1(左子树),1(头结点),5(右子树)】的摆法
            其中5(右子树)有两种摆法。这两种摆法就加入了list2里头,然后list1只有一种摆法(因为只有一个)
            然后对list1和list2里面的头结点进行排列组合即可(共两种)
             */
            for (TreeNode left : list1) {
                for (TreeNode right : list2) {
                    TreeNode father = new TreeNode(0);
                    father.left = left;
                    father.right = right;
                    list.add(father);
                }
            }
        }

        return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值