题意:
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替).
方法一:
bfs层次遍历
思路:利用队列实现 bfs 层次遍历。重点:计算每一层时,要先记录当前队列的元素个数。(可以实现每层的遍历)之后,将非空的左儿子节点入队,将非空的右儿子节点入队。最后,将偶数层的 vector 反转。
![]()
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> res;
vector<int> v;
if(pRoot==nullptr)
return res;
queue<TreeNode*> q;//队列
q.push(pRoot);//根节点入队
int id=0;
while(!q.empty()){
int num=q.size();//记录当前队列的元素个数
v.clear();
id++;
while(num--){
auto t=q.front();//出队
q.pop();
v.push_back(t->val);
if(t->left){//将非空的左儿子节点入队
q.push(t->left);
}
if(t->right){//将非空的右儿子节点入队
q.push(t->right);
}
}
if(id%2==0){//将偶数层反转
reverse(v.begin(),v.end());
}
res.push_back(v);
}
return res;
}
};
时间复杂度:
空间复杂度:![]()
方法二:
dfs 递归
思路:重点:记录每个节点的深度,而每一个的深度对应一个 vector。
因此,可以递归遍历每个节点,记录每个节点的深度。
最后,将偶数层的vector反转。
class Solution {
public:
vector<vector<int>> res;
vector<vector<int> > Print(TreeNode* pRoot) {
dfs(pRoot,1);
for(int i=1;i<res.size();i+=2){//将偶数层的vector反转
reverse(res[i].begin(),res[i].end());
}
return res;
}
void dfs(TreeNode* root,int depth){
if(root==nullptr){
return;
}
if(res.size()<depth){//新建一层
res.push_back(vector<int>());
}
res[depth-1].push_back(root->val);
dfs(root->left,depth+1);//递归左儿子节点
dfs(root->right,depth+1);//递归右儿子节点
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号