题目描述
层次遍历二叉树,是从根结点开始遍历,按层次次序“自上而下,从左至右”访问树中的各结点。
建树方法采用“先序遍历+空树用0表示”的方法
建议使用队列结构实现,算法框架如下:
定义一个空白队列和一个树结点指针p
设T是指向根结点的指针变量,若二叉树为空,则返回;否则,令p=T,p入队,执行以下循环:
(1)队首元素出队到p;
(2)访问p所指向的结点;
(3)p所指向的结点的左、右子结点依次入队。
(4)跳转步骤1循环,直到队列空为止
例如把上述算法中的访问操作定义为输出,算法结果就是把二叉树按层次遍历输出
输入
第一行输入一个整数t,表示有t个测试数据
第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行
输出
逐行输出每个二叉树的层次遍历结果
题目本身不难,照着题目做法写就行
示例代码
#include <iostream>
#include<string>
#include<stack>
#include<queue>
using namespace std;
class TreeNode{
public:
char data;
TreeNode *leftchild;
TreeNode *rightchild;
TreeNode(){
leftchild = NULL;
rightchild = NULL;
}
};
class BiTree{
public:
TreeNode *root;
string sTree;
int pos; int leavenum;stack<TreeNode *> fathers;
queue<TreeNode *>que;
BiTree():root(NULL),leavenum(0){
}
void Create(string s){
pos = 0;
sTree = s;
root = CreateTree();
}
TreeNode* CreateTree(){
TreeNode* T=new TreeNode;
char c = sTree[pos++];
if (c == '0') T = NULL;
else {
T->data = c;
T->leftchild=CreateTree();
T->rightchild =CreateTree();
}
return T;
}
void ListOrder(TreeNode *t){
TreeNode *T = new TreeNode;
if(t==NULL) return;
else{
T = t;
que.push(T);
while(!que.empty()){
T = que.front();
cout<<T->data;
que.pop();
if(T->leftchild!=NULL)
que.push(T->leftchild);
if(T->rightchild!=NULL)
que.push(T->rightchild);
}
}
}
};
int main(){
int t;
cin>>t;
while(t--){
string s;
cin>>s;
BiTree t;
t.Create(s);
t.ListOrder(t.root);
cout<<endl;
}
}