上一题才说数据结构无难题,回旋镖来的很快,很快啊jpg
思(mo)考(yu)了一个上午,只能说大脑空空。
鬼知道我最开始想的居然是列出n个元素的所有可能树结构,然后再将1-n全部放进去……
看来答案,感想是我确实想到了回溯,回溯函数传入的参数是最大到最小的值(一开始传入1和n,然后节点设为i再递归i-1到n和0到i-1)但是我思来想去也没想明白最终该怎么将它们拼接在一起……
看了评论区里的一句话只感觉感叹:兄弟,这行太卷了。不仅有十五分钟想出来的,还有五分钟写出来通过的。然后,HR把一千多个十五分钟写出来的人给拒了,怎么,你会觉得HR有眼无珠人才浪费么?呵呵,没关系,因为待会又来了一千个十五分钟内写出来的。就这么么卷,咱能怎么办?(……………………)
(我能怎么办我也很无奈啊!!)
最后看了答案写出来的:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<TreeNode*> dg(int min,int max){if(min>max) return{nullptr};vector<TreeNode*> result;for(int i=min;i<=max;i++){vector<TreeNode*> lefttree=dg(min,i-1);vector<TreeNode*> righttree=dg(i+1,max);for(auto& left:lefttree){for(auto& right:righttree){TreeNode* newtree = new TreeNode(i);newtree->left=left;newtree->right=right;result.push_back(newtree);}}}return result;}vector<TreeNode*> generateTrees(int n) {return dg(1,n);}
};
不得不说我的思路就差那么一步,我完全妹想到还可以先递归左右树的可能结果然后再拼接在一起……
答案还是太聪明了(悲)