题目:不同的二叉搜索树II
原题链接:不同的二叉搜索树II
接触到树之后,发现很多题目如果想要做对、做好,就要对递归使用非常熟练。递归确实很难把握,我自己到现在还是没有完全掌握递归,但是在做这道题时,有一个评论区的朋友说的非常好(想不起来在哪里看到的):“如果想要理解递归,就要用递归的思维方式,不要试图在脑子中一步一步进行推演”。
是啊,虽然这句话没说到底什么是递归的思维方式,但至少说明了什么不是递归的思维方式,那就是在脑子里进行演绎。因为递归的推演对于普通人的大脑来说确实很难。有时候说不要怎么做比说要怎么做更重要。
我理解的递归思维方式是这样子的:搞清楚边界(递归边界)、每一步要做什么(递归方程),而不要去管整个连贯的过程。
以上是自己对递归的愚见,递归用的好,代码看起来会很整洁优美,但是用递归时细节一定处理好,不然出了问题很难找出来错在哪里。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode*> generateTrees(int n) {
vector<TreeNode*> res;
if(n < 1) return res;
return create(1, n);
}
vector<TreeNode* > create(int start, int end){
vector<TreeNode*> res;
if(start > end) res.push_back(NULL);
for(int i = start; i <= end; i++){//以每一个节点为根节点
vector<TreeNode*> lefts = create(start, i - 1);//左子树节点
vector<TreeNode*> rights = create(i + 1, end);//右子树节点
for(auto left:lefts){
for(auto right:rights){
TreeNode* root = new TreeNode(i);
root->left = left;
root->right = right;
res.push_back(root);
}
}
}
return res;
}
};
题外话:
人生由淡淡的悲伤和淡淡的幸福组成,在小小的期待、偶尔的兴奋和沉默的失望中度过每一天,然后带着一种想说又说不出来的的“懂”,做最后的转身离开。
——龙应台《目送》