可能没想到,人的简单方法,关于质询的问题提出做。
如何把产生出来的所有的树木?所使用的方法当然是递归,但是有一个致命的问题,假设根节点,然后做一个递归,所以这是非常多的公共树木的根,结果肯定是一团糟。
怎么办?事实上,在思想上先实践的数量目前正在寻求高度统一,先把全部的左右子树都求出来。然后把它们之间的全部组合都连接到一个新建立出来的根节点,既然是分开左右子树。非常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); } };
版权声明:本文博客原创文章,博客,未经同意,不得转载。