这道题挺难,我今天在外用手机没解出来,很多思路都写不通。
第一道坎,在递归传值的问题,我将同级别的vector<int>作为参数传吧,那顶级的
vector<vector<int> >
怎么办,也要传呐。
后来发现,可以将
vector<vector<int> >
作为全局的对象,即成员变量。
再发现,传vector<int>
很麻烦,因为肯定是个引用,但一开始这个vector是没创建的,哪来的引用呢?纪录level更有效。
第二个坎,就是顺序问题,题目故意将顶层的放在vector的最后,给人一种暗示使用递归,自然倒序的感觉。后来发现压根构不成递归树。而且发现顺序的入vector,思路更加的顺,可是倒序咋办。
结果发现,这根本不是个问题,顺序的入,然后在return的时候,将成员变量倒序即可。
这是一个小技巧:
vector<int> vec;
vec_inverse = vector<int> (vec.rbegin(), vec.rend());呵呵,你以为vector容器构造函数里有个用迭代器构造是干啥使的?
其余的没啥好说的了。遇到level第一个元素,需要在vector<vector<int>
>中塞一个vector.后续的只需要在该vector中push_back即可。
记录level就是为了找到那个vector.
#include <vector>
using std::vector;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<vector<int> > levelOrderBottom(TreeNode *root) {
levelOrderBottom(root, 0);
return vector<vector<int> >(vec_.rbegin(), vec_.rend());
}
private:
void levelOrderBottom(TreeNode *root, int level) {
if (root == NULL) return;
if (vec_.size() == level) vec_.push_back({root->val});
else vec_[level].push_back(root->val);
levelOrderBottom(root->left, level+1);
levelOrderBottom(root->right, level+1);
}
private:
vector<vector<int> > vec_;
};