二叉树的层次遍历

要进行层次遍历,需要建立一个循环队列。先将二叉树头结点入队列,然后出队列,访问该结点,如果它有左子树,则将左子树的根结点入队;如果它有右子树,则将右子树的根结点入队。然后出队,对出队结点访问,如此反复,直到队列为空为止。

层次遍历函数如下:

/*
树的层次遍历。
需要建立一个队列,直到队列为空为止。
*/
void Level(BTNode *p)
{	
	if(p!=NULL)
	{
		int front,rear;
		BTNode *que[maxsize];	//指针型数组,作为队列。
		front=rear=0;			//初始化循环队列。
		BTNode *q;

		rear=(rear+1)%maxsize;	//根节点入队。
		que[rear]=p;

		while(front!=rear)		//当队列不空的时候进行循环。
		{
			front=(front+1)%maxsize;
			q=que[front];		//队头结点出队。
			Visit(q);			//访问队头结点。
			if(q->lchild!=NULL)		//若左子树不为空,则左子树根节点入队。
			{
				rear=(rear+1)%maxsize;
				que[rear]=q->lchild;
			}
			if(q->rchild!=NULL)
			{
				rear=(rear+1)%maxsize;
				que[rear]=q->rchild;
			}
		}
	}
}

包括构造二叉树过程,完整的测试代码如下:

#include<iostream>
using namespace std;
int const maxsize=20;
typedef char Elemtype;
typedef struct BTNode
{
	Elemtype data;
	struct BTNode *lchild;
	struct BTNode *rchild;
}BTNode;

/*
插入数据元素,使二叉树成为一颗二叉搜索树。
规定左子树(数据域)小于右子树(数据域)。
*/
BTNode* Insert(BTNode *p,Elemtype data)
{
	if(NULL==p)
	{
		p=(BTNode *)malloc(sizeof(BTNode));
		p->data=data;
		p->lchild=NULL;
		p->rchild=NULL;
	}
	else
	{
		if(data<p->data)
		{
			p->lchild=Insert(p->lchild,data);
		}
		else
		{
			p->rchild=Insert(p->rchild,data);
		}
	}
	return p;
}

/*
初始化二叉树。
对树结构进行修改,第一个参数必须使用引用(&),
否则,应当返回修改后的树根节点,如图Insert()函数的操作。
*/
void Init(BTNode *&p,Elemtype a[],int n)
{
	if(n!=0)
	{
		for(int i=0;i<n;++i)
		{
			p=Insert(p,a[i]);
		}
	}
}

/*
对二叉树结点的访问操作。
*/
void Visit(BTNode *p)
{
	cout<<p->data<<endl;
}

/*
先序遍历二叉树。
*/
void PreOrder(BTNode *p)
{
	if(p!=NULL)
	{
		Visit(p);
		PreOrder(p->lchild);
		PreOrder(p->rchild);
	}
}

/*
树的层次遍历。
需要建立一个队列,直到队列为空为止。
*/
void Level(BTNode *p)
{	
	if(p!=NULL)
	{
		int front,rear;
		BTNode *que[maxsize];	//指针型数组,作为队列。
		front=rear=0;			//初始化循环队列。
		BTNode *q;

		rear=(rear+1)%maxsize;	//根节点入队。
		que[rear]=p;

		while(front!=rear)		//当队列不空的时候进行循环。
		{
			front=(front+1)%maxsize;
			q=que[front];		//队头结点出队。
			Visit(q);			//访问队头结点。
			if(q->lchild!=NULL)		//若左子树不为空,则左子树根节点入队。
			{
				rear=(rear+1)%maxsize;
				que[rear]=q->lchild;
			}
			if(q->rchild!=NULL)
			{
				rear=(rear+1)%maxsize;
				que[rear]=q->rchild;
			}
		}
	}
}

int main()
{
	BTNode *t=NULL;
	Elemtype e[]={'d','e','f','g','h','a','b','c'};
	Init(t,e,sizeof(e)/sizeof(e[0]));
	PreOrder(t);
	cout<<endl;
	Level(t);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值