层次遍历二叉树
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:681 测试通过:225
用到list的写法:
总提交:681 测试通过:225
描述
二叉树是非常重要的树形数据结构,层次遍历一棵二叉树是按从上到下、从左到右的次序访问树上的结点。例如,图1020所示的二叉树层次遍历序列为A B C D E F。
图1020
请根据先序遍历序列建立一棵的二叉树(用#代表空树或空子树),输出层次遍历序列。
输入
二叉树的先序遍历序列,用#代表空树或空子树
输出
二叉树层次遍历序列
样例输入
A B # D # # C E # # F # #
样例输出
LevelOrder: A B C D E F
题目来源
CHENZ
分析:class BTNode()、void Create(*&t) 与上题一样,此题按层输出。层序遍历与其他类型的遍历不同的地方在于它不是递归地执行的;它用到队列,而不使用递归所默认的栈。
还有种写法是用到C++提供的list。
#include<iostream>
using namespace std;
//层次遍历二叉树
class BTNode
{
public:
char data;
BTNode *lChild;
BTNode *rChild;
BTNode(char c)
{
data = c;
}
};
void Create(BTNode *&t)
{
char c;
cin>>c;
if(c == '#')
t = NULL;
else
{
t = new BTNode(c);
t->lChild = NULL;
t->rChild = NULL;
Create(t->lChild);
Create(t->rChild);
}
}
//层次遍历
void LevelOrder(BTNode *&t)
{
int front = 0, rear = 1; // 写在内部
BTNode *p[100];
p[0] = t;
while(front < rear)
{
if(p[front])
{
cout<<" "<<p[front]->data;
p[rear++] = p[front]->lChild;
p[rear++] = p[front]->rChild;
front ++;
}
else
front ++;
}
}
int main()
{
BTNode *t;
Create(t);
cout<<"LevelOrder:";
LevelOrder(t);
cout<<endl;
return 0;
}
用到list的写法:
#include<iostream>
using namespace std;
#include<list>
//层次遍历二叉树
class BTNode
{
public:
char data;
BTNode *lChild;
BTNode *rChild;
BTNode(char c)
{
data = c;
}
};
void Create(BTNode *&t)
{
char c;
cin>>c;
if(c == '#')
t = NULL;
else
{
t = new BTNode(c);
t->lChild = NULL;
t->rChild = NULL;
Create(t->lChild);
Create(t->rChild);
}
}
void LevelOrder(BTNode *&t)
{
list<BTNode*> myList; // 新建一个list
if(t == NULL)
return ;
else
{
myList.push_back(t); // 在list的末尾添加一个元素
while(myList.size() > 0) // while循环
{
BTNode *p = myList.front(); // 返回第一个元素
cout<<" "<<p->data;
if(p->lChild) myList.push_back(p->lChild); // 添加左孩子
if(p->rChild) myList.push_back(p->rChild); // 添加右孩子
myList.pop_front(); // 删除第一个元素
}
}
}
int main()
{
BTNode *t;
Create(t);
cout<<"LevelOrder:";
LevelOrder(t);
cout<<endl;
return 0;
}