美文网首页
Leetcode 894. 所有可能的满二叉树

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

作者: 进击的Lancelot | 来源:发表于2020-06-15 09:07 被阅读0次

问题描述

满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点。
返回包含 N 个结点的所有可能满二叉树的列表。 答案的每个元素都是一个可能树的根结点。
答案中每个树的每个结点都必须有 node.val=0。
你可以按任何顺序返回树的最终列表。
注意:

  • 1 <= N <= 20
  • 题中的“满二叉树”的定义其实是 2 - 正则树的定义

Example

输入:7
输出:[[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]]

解释:

题目链接:894. 所有可能的满二叉树 (难度:中等)

思路

由题目所给出的定义可知,对于任一棵满足 2 - 正则树定义的树,其节点个数必定为奇数个。若为偶数个节点,则必定存在一个分支节点,其子节点仅有 1 个,与定义矛盾。我们可以设 func(N) 代表了 N 个节点所能构成 2 - 正则树的所有树形,那么我们可以先看看当 N 为奇数 1,3,5, 7 的情况(对于 N == 7 的情况,可以参考题目示例,这里不赘述)

N = 1, 3, 5 的情况

从示例当中可以我们可以看出,要求解 func(3) 需要先求出 func(1), 而要求解出 func(5) 则需要求解出 func(1) 和 func(3)。为了避免重复计算,可以利用 dp 数组对应的结果,避免重复计算。至此,我们可以得出如下的递归模型:

递归模型 func(N) :

  • 当 N 为偶数时,不存在合法的二叉树,返回空的 dp 数组
  • 当 N == 1 时,将单个根节点压入 dp 并返回
  • 当 N 为大于 1 的奇数时,建立一个根节点 root,并令 root 的左右指针分别指向 func(i) 和 func(N - 1 - i),其中 i 为大于 1 小于 N - 1 的全体奇数。

代码

class Solution {
public:
    vector<TreeNode*> allPossibleFBT(int N) {
        vector<TreeNode*> dp;
        if((N & 1) == 0)
            return dp;
        if(N == 1){
            dp.push_back(new TreeNode(0));
            return dp;
        }
        for(int i = 1;i < N - 1;i += 2){
            vector<TreeNode*> l_tree = allPossibleFBT(i);
            vector<TreeNode*> r_tree = allPossibleFBT(N - 1 - i);
            for(int j = 0;j < l_tree.size();++j){
                for(int k = 0;k < r_tree.size();++k){
                    TreeNode* root = new TreeNode(0);
                    root->left = l_tree[j];
                    root->right = r_tree[k];
                    dp.push_back(root);
                }
            }
        }
        return dp;
    }
};

相关文章

网友评论

      本文标题:Leetcode 894. 所有可能的满二叉树

      本文链接:https://www.haomeiwen.com/subject/czjqxktx.html