题目描述: 二叉树的层次遍历
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回其自自底向上的层次遍历为:
[ [15,7], [9,20], [3] ]
解题思路:
层次遍历一般用到队列,一开始的想法就是从头到尾用队列遍历一边,然后记录每个结点的深度和值,再倒序遍历一次每个结点,感觉很麻烦,要用到迭代器,重新构造结构体等等,就参考了一下别人的方法。
主要是对vector的压入作了一些处理,可以让尾部的数组先入栈,一种是我代码中的vvi.insert(vvi.begin(),v),每次都在第一项插入;另一种是依次插入,最后再倒序。这样就可以不用记录结点的深度了,唯一要做的就是得到每一层的结点个数,因为会对队列不停的pop,所以队列中剩下的size() 就是下一层结点的个数。
代码:
/**
* 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<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> vvi;
if(root == NULL) return vvi;
queue<TreeNode*> q;
vector<int> v;
q.push(root);
int i = 1;
while(!q.empty()) {
TreeNode* t = q.front();
q.pop();
i--;
if(t->left != NULL)
q.push(t->left);
if(t->right != NULL)
q.push(t->right);
v.push_back(t->val);
if(i == 0) {
vvi.insert(vvi.begin(), v);
i = q.size();
v.clear();
}
}
return vvi;
}
};