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;
int main()
{
char tree[100005]; //树的顺序储存
cin>>tree;
int s=strlen(tree);
queue<char> que;
stack<char> st;
que.push(tree[0]); //树根入列
int flag=1,len=1,n=1; //flag是翻转标记,len是当前队列长度,n是读取树的下标
while(len>0) //当队列有内容时
{
len=que.size(); //当前队列长度
if(!len) //这里也可直接判断队列是否有内容
break;
len*=2; //读取下一层的长度为当前队列长度的两倍
if(flag) //如果是奇数层,则从左到右输出,直接用队列输出
{
while(!que.empty()) //将队列内容全部输出
{
cout<<que.front();
que.pop();
if(!que.empty())
cout<<' ';
else
cout<<endl;
}
flag=!flag; //更新翻转标记
}
else
{
while(!que.empty()) //如果是偶数层,则用一个栈来实现逆序输出
{
st.push(que.front()); //将队列的内容存进栈
que.pop();
}
while(!st.empty()) //输出栈的内容
{
cout<<st.top();
st.pop();
if(!st.empty())
cout<<' ';
else
cout<<endl;
}
flag=!flag;
}
for(int i=1;i<=len&&n<s;i++) //读取下一层的内容
{
if(tree[n]!='#')
que.push(tree[n]);
n++;
}
}
}