层次遍历二叉树
1、若树非空,访问根结点。
#include<queue>
using namespace std;
typedef struct Bitree
{
int data;
struct Bitree *Lchild,*Rchild;
}BitreeNode,*LinkBitree;
const int STOP_INPUT=0;
LinkBitree CreatBitree();
void LevelOrderTraverse(LinkBitree);
int main()
{
LinkBitree BitreeHead;
cout<<"请输入根结点的值:\n";
BitreeHead=CreatBitree();
LevelOrderTraverse(BitreeHead);
return 0;
}
LinkBitree CreatBitree()
{
int e_data;
LinkBitree BitreeHead;
cin>>e_data;
if(e_data!=STOP_INPUT)
{
BitreeHead=new BitreeNode;
if(BitreeHead==NULL)
{
cout<<"\nError!!\n";
}
else
{
BitreeHead->data=e_data;
cout<<"请输入结点"<<BitreeHead->data<<"的左孩子结点的值:\n";
BitreeHead->Lchild=CreatBitree();
cout<<"请输入结点"<<BitreeHead->data<<"的右孩子结点的值:\n";
BitreeHead->Rchild=CreatBitree();
}
}
else
{
BitreeHead=NULL;
}
return BitreeHead;
}
void LevelOrderTraverse(LinkBitree BitreeHead)
{
queue<LinkBitree> Q;
if(BitreeHead!=NULL)
{
Q.push(BitreeHead);//根节点入队列
}
while(!Q.empty())//队列不为空
{
cout<<Q.front()->data<<" "; //输出作为遍历操作
//Q.pop();
if(Q.front()->Lchild!=NULL)//左孩子不为空,入队列
{
Q.push(Q.front()->Lchild);
}
if(Q.front()->Rchild!=NULL)//右孩子不为空,入队列
{
Q.push(Q.front()->Rchild);
}
Q.pop();
}
}
/*******************************
输入二叉树形态如下:
1
2 5
3 4 0 0
0 0 0 0
********************************/
/*********************************
运行结果:
请输入根结点的值:
1
请输入结点1的左孩子结点的值:
2
请输入结点2的左孩子结点的值:
3
请输入结点3的左孩子结点的值:
0
请输入结点3的右孩子结点的值:
0
请输入结点2的右孩子结点的值:
4
请输入结点4的左孩子结点的值:
0
请输入结点4的右孩子结点的值:
0
请输入结点1的右孩子结点的值:
5
请输入结点5的左孩子结点的值:
0
请输入结点5的右孩子结点的值:
0
1 2 5 3 4
************************************/
1、若树非空,访问根结点。
2、若第1,…i(i≥1)层结点已被访问,且第i+1层结点尚未访问,则从左到右依次访问第i+1层。
层次遍历二叉树,是从根结点开始遍历,按层次次序“自上而下,从左至右”访问树中的各结点。
为保证是按层次遍历,必须设置一个队列,初始化时为空。
设T是指向根结点的指针变量,层次遍历非递归算法是:
若二叉树为空,则返回;否则,令p=T,p入队;
⑴ 队首元素出队到p;
⑵访问p所指向的结点;
⑶将p所指向的结点的左、右子结点依次入队。直到队空为止。
层序遍历
二叉树的层次遍历是指从二叉树的第一层(即根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。
#include<iostream>
#include<queue>
using namespace std;
typedef struct Bitree
{
int data;
struct Bitree *Lchild,*Rchild;
}BitreeNode,*LinkBitree;
const int STOP_INPUT=0;
LinkBitree CreatBitree();
void LevelOrderTraverse(LinkBitree);
int main()
{
LinkBitree BitreeHead;
cout<<"请输入根结点的值:\n";
BitreeHead=CreatBitree();
LevelOrderTraverse(BitreeHead);
return 0;
}
LinkBitree CreatBitree()
{
int e_data;
LinkBitree BitreeHead;
cin>>e_data;
if(e_data!=STOP_INPUT)
{
BitreeHead=new BitreeNode;
if(BitreeHead==NULL)
{
cout<<"\nError!!\n";
}
else
{
BitreeHead->data=e_data;
cout<<"请输入结点"<<BitreeHead->data<<"的左孩子结点的值:\n";
BitreeHead->Lchild=CreatBitree();
cout<<"请输入结点"<<BitreeHead->data<<"的右孩子结点的值:\n";
BitreeHead->Rchild=CreatBitree();
}
}
else
{
BitreeHead=NULL;
}
return BitreeHead;
}
void LevelOrderTraverse(LinkBitree BitreeHead)
{
queue<LinkBitree> Q;
if(BitreeHead!=NULL)
{
Q.push(BitreeHead);//根节点入队列
}
while(!Q.empty())//队列不为空
{
cout<<Q.front()->data<<" "; //输出作为遍历操作
//Q.pop();
if(Q.front()->Lchild!=NULL)//左孩子不为空,入队列
{
Q.push(Q.front()->Lchild);
}
if(Q.front()->Rchild!=NULL)//右孩子不为空,入队列
{
Q.push(Q.front()->Rchild);
}
Q.pop();
}
}
/*******************************
输入二叉树形态如下:
1
2 5
3 4 0 0
0 0 0 0
********************************/
/*********************************
运行结果:
请输入根结点的值:
1
请输入结点1的左孩子结点的值:
2
请输入结点2的左孩子结点的值:
3
请输入结点3的左孩子结点的值:
0
请输入结点3的右孩子结点的值:
0
请输入结点2的右孩子结点的值:
4
请输入结点4的左孩子结点的值:
0
请输入结点4的右孩子结点的值:
0
请输入结点1的右孩子结点的值:
5
请输入结点5的左孩子结点的值:
0
请输入结点5的右孩子结点的值:
0
1 2 5 3 4
************************************/
#include<iostream>#include<queue>
using namespace std;
typedef struct Bitree
{
int data;
struct Bitree *Lchild,*Rchild;
}BitreeNode,*LinkBitree;
const int STOP_INPUT=0;
LinkBitree CreatBitree();
void LevelOrderTraverse(LinkBitree);
int main()
{
LinkBitree BitreeHead;
cout<<"请输入根结点的值:\n";
BitreeHead=CreatBitree();
LevelOrderTraverse(BitreeHead);
return 0;
}
LinkBitree CreatBitree()
{
int e_data;
LinkBitree BitreeHead;
cin>>e_data;
if(e_data!=STOP_INPUT)
{
BitreeHead=new BitreeNode;
if(BitreeHead==NULL)
{
cout<<"\nError!!\n";
}
else
{
BitreeHead->data=e_data;
cout<<"请输入结点"<<BitreeHead->data<<"的左孩子结点的值:\n";
BitreeHead->Lchild=CreatBitree();
cout<<"请输入结点"<<BitreeHead->data<<"的右孩子结点的值:\n";
BitreeHead->Rchild=CreatBitree();
}
}
else
{
BitreeHead=NULL;
}
return BitreeHead;
}
void LevelOrderTraverse(LinkBitree BitreeHead)
{
queue<LinkBitree> Q;
if(BitreeHead!=NULL)
{
Q.push(BitreeHead);//根节点入队列
}
while(!Q.empty())//队列不为空
{
cout<<Q.front()->data<<" "; //输出作为遍历操作
//Q.pop();
if(Q.front()->Lchild!=NULL)//左孩子不为空,入队列
{
Q.push(Q.front()->Lchild);
}
if(Q.front()->Rchild!=NULL)//右孩子不为空,入队列
{
Q.push(Q.front()->Rchild);
}
Q.pop();
}
}
/*******************************
输入二叉树形态如下:
1
2 5
3 4 0 0
0 0 0 0
********************************/
/*********************************
运行结果:
请输入根结点的值:
1
请输入结点1的左孩子结点的值:
2
请输入结点2的左孩子结点的值:
3
请输入结点3的左孩子结点的值:
0
请输入结点3的右孩子结点的值:
0
请输入结点2的右孩子结点的值:
4
请输入结点4的左孩子结点的值:
0
请输入结点4的右孩子结点的值:
0
请输入结点1的右孩子结点的值:
5
请输入结点5的左孩子结点的值:
0
请输入结点5的右孩子结点的值:
0
1 2 5 3 4
************************************/