可能没想到,人的简单方法,关于质询的问题提出做。
如何把产生出来的所有的树木?所使用的方法当然是递归,但是有一个致命的问题,假设根节点,然后做一个递归,所以这是非常多的公共树木的根,结果肯定是一团糟。
怎么办?事实上,在思想上先实践的数量目前正在寻求高度统一,先把全部的左右子树都求出来。然后把它们之间的全部组合都连接到一个新建立出来的根节点,既然是分开左右子树。非常easy想到类似二分的思想。每次指定的不是一个位置。而是一个范围。我一開始还想着先把n个数放到数组里面再递归,脱了裤子放屁啊。
通过对算法思想的描写叙述,“先确定左右子树,再加入根节点”。非常easy想到使用类似后序遍历的编码格式。
class Solution {
public:
vector<TreeNode *> buildTrees(int beg, int end){
vector<TreeNode *> res, left, right;
if(beg>end){
res.push_back(NULL);
return res;
}
for(int i=beg;i<=end;i++){
left = buildTrees(beg, i-1);
right = buildTrees(i+1, end);
for(int j=0;j<left.size();j++){
for(int k=0;k<right.size();k++){
TreeNode *root = new TreeNode(i+1);
root->left = left[j];
root->right = right[k];
res.push_back(root);
}
}
}
return res;
}
vector<TreeNode *> generateTrees(int n) {
return buildTrees(0, n-1);
}
};
版权声明:本文博客原创文章,博客,未经同意,不得转载。