给你二叉树的根节点 root
,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
/**
* 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) {}
* };
*/
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[15,7],[9,20],[3]]
示例 2:
输入:root = [1] 输出:[[1]]
思路
我们有两个工作要做:先用队列依次进行层级搜索,然后入栈缓存。
广度优先搜索(BFS)是依靠队列进行的搜索算法,他可以帮助我们完成自上而下的层级搜索。
BFS依次搜层,每搜完一层就入栈缓存。最后清空栈返回答案。
解题过程
BFS依次搜层,每搜完一层就入栈缓存。最后清空栈返回答案。
构造一个queue<TreeNode*>que,将初始root入栈。
随后进行while(!que.empty())外层循环,我们的每一次外层循环都完成一层搜索,定义layer数组来储存每一层的搜索结果。
每次外层循环循环定义int len=队列的当前长度,通过内层循环while(len--)来保证队列内的值全部更新一次,内层循环中依次取出队头后加入到layer数组中,判断其左子树和右子树是否需要入队(空节点不入队)。
每完成一次外层循环,队列中的每个元素都向他的左右子树演替了一次,队列清空后即搜索结束。
我们将每一层的搜索结果入栈,生成答案时依次出栈就得到了倒序的层序遍历结果。
Code
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>>ans;//答案
if(!root)return ans;
stack<vector<int>>stv;//缓存栈
queue<TreeNode*>que;que.push(root);//根节点入队
while(!que.empty()){
int len=que.size(),i=0;
vector<int>layer(len);//保存单层结果
while(len--){//对队列进行一次演替
TreeNode* node=que.front();que.pop();
layer[i++]=node->val;
if(node->left)que.push(node->left);//节点有效才入队,nullptr等效为0不入队
if(node->right)que.push(node->right);
}
stv.push(layer);//按层入栈
}
while(!stv.empty()){//依次出栈
ans.push_back(stv.top());//压入答案
stv.pop();
}
return ans;
}
};