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; } };