给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回其自底向上的层次遍历为:
[ [15,7], [9,20], [3] ]
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
层次遍历当然用的是广度优先遍历了,但是这道题的唯一的一个难点就是怎么把每一层的元素都写到一个子容器里。
要用到两层循环,而且内循环的循环次数就是每层的元素个数。
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> s;
queue<TreeNode*> q;
if (root==NULL)
return s;
//s[0].push_back(root->val); //这样写为什么不行呢?? 不明白。
q.push(root);
while(!q.empty())
{
int len=q.size(); //计算出每层的元素个数,方便下面的循环的次数的统计。
vector<int>temm;
for (int j=0;j<len;j++)
{
TreeNode * tem=q.front();
temm.push_back(tem->val);
if (tem->left!=NULL)
{
q.push(tem->left);
}
if (tem->right!=NULL)
{
q.push(tem->right);
}
q.pop();
}
s.push_back(temm);
}
reverse(s.begin(),s.end()); //将容器的内容进行反置。。。。。
return s;
}
};
这道题的思路还是中的内循环真的没想到,没想到队列还有一个size()函数,来记录它的里面的元素的个数。