给定节点个数,求所有可能二叉树,该二叉树所有节点要么有0个子节点要么有两个子节点。返回所有二叉树的头指针。
一开始一直想的是从根节点开始建树,一直想不出来方法。后来想到可以从子节点开始建树,问题就很好解决了。
class Solution{public: vectorallPossibleFBT(int N) { vector 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 left = allPossibleFBT(i); //创建所有可能左子树 vector right = allPossibleFBT(N-1-i); //创建所有可能的右子树 for(int j=0;j 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; }};