题解:
- 注意CreateTree传引用!!!又被卡在这个问题上了。。。
- 层次遍历的方法是利用队列,先放入根节点,之后每每弹出一个元素就放入它的左右孩子节点,如果左右孩子为NULL则不放入,直到队列为空,即BFS的思路。
题目:
问题 F: DS二叉树--层次遍历
时间限制: 1 Sec 内存限制: 128 MB
提交: 389 解决: 337
[提交][状态][讨论版]
题目描述
层次遍历二叉树,是从根结点开始遍历,按层次次序“自上而下,从左至右”访问树中的各结点。
建树方法采用“先序遍历+空树用0表示”的方法
要求:采用队列对象实现,函数框架如下:

输入
第一行输入一个整数t,表示有t个测试数据
第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行
输出
逐行输出每个二叉树的层次遍历结果
样例输入
2
AB0C00D00
ABCD00E000FG00H0I00
样例输出
ABDC
ABFCGHDEI
代码块:
#include <iostream>
#include <queue>
using namespace std;
class BiTNode
{
public:
char data;
BiTNode *lchild, *rchild;
BiTNode(){}
~BiTNode(){}
};
class BiTree
{
public:
BiTNode *root;
BiTree(){}
~BiTree(){}
void CreateTree();
void CreateTree(BiTNode *&p);
void LevelOrder();
void LevelOrder(BiTNode *p);
};
void BiTree::CreateTree()
{
CreateTree(root);
}
void BiTree::CreateTree(BiTNode *&p)
{
char ch;
cin>>ch;
if(ch!='0')
{
p = new BiTNode;
p->data = ch;
CreateTree(p->lchild);
CreateTree(p->rchild);
}
else
p = NULL;
}
void BiTree::LevelOrder()
{
LevelOrder(root);
}
void BiTree::LevelOrder(BiTNode *p)
{
queue<BiTNode *> tq;
tq.push(p);
while(!tq.empty())
{
p = tq.front();
tq.pop();
cout<<p->data;
if(p->lchild)
tq.push(p->lchild);
if(p->rchild)
tq.push(p->rchild);
}
cout<<endl;
}
int main(void)
{
int t;
cin>>t;
while(t--)
{
BiTree myTree;
myTree.CreateTree();
myTree.LevelOrder();
}
}