Leetcode894 - All Possible Full Binary Trees

题目:

A full binary tree is a binary tree where each node has exactly 0 or 2 children.

Return a list of all possible full binary trees with N nodes. Each element of the answer is the root node of one possible tree.

Each node of each tree in the answer must have node.val = 0.

You may return the final list of trees in any order.
Example 1:

Input: 7
Output: [[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,null,null,0,0],[0,0,0,0,0,null,null,0,0]]
Explanation:


Note:

  • 1 <= N <= 20

思路:

该题的主要思路是递归。需要找到左子树有几种可能的情况以及右子树有几种可能的情况,详细的说是当左子树的结点数为i时,右子树为N-i时,子树可能出现的几种情况。然后再进行组合。得到结点数为N的情况下可能的子树情况。


代码:

public List<TreeNode> allPossibleFBT(int N) {
        List<TreeNode>result = new ArrayList<TreeNode>();
        if(N == 0){
            return result;
        }
        if(N == 1){
            TreeNode node = new TreeNode(0);
            result.add(node);
            return result;
        }
        N--;
        for(int i=1;i<=N;i+=2){
            List<TreeNode>L = allPossibleFBT(i);
            List<TreeNode>R = allPossibleFBT(N-i);
            for(TreeNode l:L){
                for(TreeNode r:R){
                    TreeNode node = new TreeNode(0);
                    node.left = l;
                    node.right = r;
                    result.add(node);
                }
            }
        }
        return result;
    }

题后思考

做完这道题之后思考了一些。为了能够把这道题给吃透。这道题要的是全二叉子树,就是每个结点要么有两个子节点要么都没有结点。那么可不可把这道题改一下。给定结点的数目求这些结点能够组成的二叉树。其实只需要在原先的代码上稍加改动即可。首先循环需要从0开始,其次得到的左右子树可能有空子树,因此需要分情况讨论,左子树为空,右子树为空,左右子树不空三种情况。


代码:

public List<TreeNode> allPossibleTrees(int N){
    List<TreeNode>result = new ArrayList<TreeNode>();
    if(N == 0){
        return result;
    }
    if(N == 1){
        TreeNode node = new TreeNode(0);
        result.add(node);
        return result;
    }
    N--;
    for(int i=0;i<=N;i++){
        List<TreeNode>L = allPossibleTrees(i);
        List<TreeNode>R = allPossibleTrees(N - i);
        if(L.size() == 0){
            for(TreeNode r:R){
                TreeNode node = new TreeNode(0);
                node.right = r;
                result.add(node);
            }
        }else if(R.size() == 0){
            for(TreeNode l:L){
                TreeNode node = new TreeNode(0);
                node.left = l;
                result.add(node);
            }
        }else{
            for(TreeNode l:L){
                for(TreeNode r:R){
                    TreeNode node = new TreeNode(0);
                    node.left = l;
                    node.right = r;
                    result.add(node);
                }
            }
        }
    }
    return result;
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容