题目描述
层次遍历二叉树,是从根结点开始遍历,按层次次序"自上而下,从左至右"访问树中的各结点。
建树方法采用"先序遍历+空树用0表示"的方法
建议使用队列结构实现,算法框架如下:
定义一个空白队列和一个树结点指针p
设T是指向根结点的指针变量,若二叉树为空,则返回;否则,令p=T,p入队,执行以下循环:
(1)队首元素出队到p;
(2)访问p所指向的结点;
(3)p所指向的结点的左、右子结点依次入队。
(4)跳转步骤1循环,直到队列空为止
例如把上述算法中的访问操作定义为输出,算法结果就是把二叉树按层次遍历输出
输入
第一行输入一个整数t,表示有t个测试数据
第二行起输入二叉树先序遍历的结果,空树用字符’0’表示,输入t行
输出
逐行输出每个二叉树的层次遍历结果
输入样例
2
AB0C00D00
ABCD00E000FG00H0I00
输出样例
ABDC
ABFCGHDEI
代码
#include<iostream>
#include<queue>
using namespace std;
class Node{
public:
char data;
Node *lchild,*rchild;
Node():lchild(NULL),rchild(NULL){};
Node(char data):this->data(data),lchild(NULL),rchild(NULL){};
};
class Tree{
public:
Node* root;
Tree(){
root=NULL;
}
void createtree()
{
createtree(root,NULL);
}
void createtree(Node *&t,Node* p)
{
char c;
cin>>c;
if(c!='0')
{
t=new Node(c);
createtree(t->lchild,t);
createtree(t->rchild,t);
}
else
t=NULL;
}
void Order(Node *t){
queue<Node*> q;
Node* temp;
q.push(t);
while(!q.empty())
{
temp=q.front();
cout<<temp->data;
if(temp->lchild)
q.push(temp->lchild);
if(temp->rchild)
q.push(temp->rchild);
q.pop();
}
}
};
int main()
{
int t;
cin>>t;
while(t--)
{
Tree t1;
t1.createtree();
t1.Order(t1.root);
cout<<endl;
}
}