[二叉树专题]:广度优先:按层次遍历二叉树的非递归实现||使用队列实现层次遍历二叉树

层次遍历二叉树
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
************************************/



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值