leetcode_894. All Possible Full Binary Trees

https://leetcode.com/problems/all-possible-full-binary-trees/

给定节点个数,求所有可能二叉树,该二叉树所有节点要么有0个子节点要么有两个子节点。返回所有二叉树的头指针。

一开始一直想的是从根节点开始建树,一直想不出来方法。后来想到可以从子节点开始建树,问题就很好解决了。

class Solution
{
public:
    vector<TreeNode*> allPossibleFBT(int N)
    {
        vector<TreeNode*> ret;
        if(N == 1)
        {
            TreeNode* rt = new TreeNode(0);
            ret.push_back(rt);
            return ret;
        }
        for(int i=1; i<=(N-1)/2; i+=2)  //左子树的节点数
        {
            vector<TreeNode*> left = allPossibleFBT(i);      //创建所有可能左子树
            vector<TreeNode*> right = allPossibleFBT(N-1-i);  //创建所有可能的右子树
            for(int j=0;j<left.size();j++)      //遍历所有左子树
                for(int k=0;k<right.size();k++)    //遍历所有右子树
            {
                TreeNode * rt = new TreeNode(0);   //创建根节点
                rt->left = left[j];
                rt->right = right[k];
                ret.push_back(rt);
                if(i != N-1-i)      //如果左右子树节点数不同,交换左右子树也是一种可能
                {
                    TreeNode * rt2 = new TreeNode(0);
                    rt2->left = right[k];
                    rt2->right = left[j];
                    ret.push_back(rt2);
                }
            }
        }
        return ret;
    }
};
原文地址:https://www.cnblogs.com/jasonlixuetao/p/10582693.html