18959 二叉树的之字形遍历
Description
题目来源:字节跳动测试题
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
例如:
给定的二叉树是{3,9,20,15,7,#,#},
该二叉树之字形层序遍历的结果是
3
20 9
15 7
输入格式
一行字符串,只包含大写字母和#。
此处采用完全二叉树的顺序存储结构。
输出格式
若干行,之字形输出树的结点,每一行输出树的一层。
输入样例
ABC###D##
输出样例
A
C B
D
解题:
用队列和栈实现
队列:顺序输出
栈:逆序输出
#include <iostream>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
char tree[100005]; //树的顺序储存
int main()
{
ios::sync_with_stdio(false);
cin>>tree;
int n = strlen(tree);
queue<char> Q;
stack<char> S;
//树根入列
Q.push(tree[0]);
//定义一个标记,1为正序(左到右),0为逆序(右到左)
int flag = 1;
int len = 1;//长度
int k = 1;//树结点下标
//遍历队列
while(len > 0){ //当队列有内容时
len = Q.size();
len *= 2; //读取下一层的长度为当前列长度的两倍
if(flag) //奇数层
{
//直接将队列的内容输出
while(!Q.empty()){
cout << Q.front();
Q.pop();
if(!Q.empty()){
cout << " ";
}
else{
cout << endl;
}
}
flag = 0;//重新翻转标记
}
//flag为0时,逆序输出(用栈)
else{
while(!Q.empty()){
S.push(Q.front());
Q.pop();
}
//输出
while(!S.empty()){
cout << S.top();
S.pop();
if(!S.empty()){
cout << " ";
}
else{
cout << endl;
}
}
//翻转
flag = 1;
}
//读取下一层
for(int i = 1;i <= len && k < n;i++){
if(tree[k] != '#')
//下一层入队
Q.push(tree[k]);
k++;
}
}
}