层次遍历
给定二叉树的包含虚结点的先序遍历序列信息,按层次顺序给出遍历的结果。
输入格式:
首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据在一行中输入一个字符串(不含空格且长度不超过80),表示二叉树的先序遍历序列(其中@表示虚结点)。
输出格式:
对于每组测试,输出层次遍历的结果。
输入样例:
1
ABD@@EG@@@C@F@@
输出样例:
ABCDEFG
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
解题代码
#include<bits/stdc++.h>
using namespace std;
int len;
string str;
template<class T>
struct treeNode{
T data;
treeNode *L_child,*R_child;
};
template<class T>
class Tree{
public:
~Tree(){
this->root=new treeNode<T>();
this->root->L_child=NULL;
this->root->R_child=NULL;
}
treeNode<T>* createTree();
treeNode<T>* getRoot();
private:
treeNode<T> *root;
};
template<class T>
treeNode<T>* Tree<T>::createTree()
{
if(len>=str.size()) return NULL;
T d = str[len++];
if(d=='@'){
return NULL;
}
treeNode<T> *node = new treeNode<T>();
node->data=d;
node->L_child=createTree();
node->R_child=createTree();
return node;
}
template<class T>
treeNode<T>* Tree<T>::getRoot()
{
return this->root;
}
void levelFind(treeNode<char> *root){
if(root==NULL) return;
queue<treeNode<char>*> q;
q.push(root);
treeNode<char> *t;
while(!q.empty()){
t=q.front();
if(t->L_child!=NULL){
q.push(t->L_child);
}
if(t->R_child!=NULL){
q.push(t->R_child);
}
cout<<t->data;
q.pop();
}
cout<<endl;
}
int main()
{
int n;
cin>>n;
while(n--){
len=0;
cin>>str;
Tree<char> *tree = new Tree<char>();
treeNode<char> *root = tree->getRoot();
root = tree->createTree();
levelFind(root);
}
}
解题思路
这里我改了一下之前的代码,使用模板类,但是把结构体放到了外面,这样子方便使用,层次遍历需要用到队列去遍历,具体看https://zhuanlan.zhihu.com/p/107494578