第五章 树—二叉树的层次遍历与深度优先遍历
数据结构基础代码 (严蔚敏 人邮教育出版社)
层次遍历
我们如下图所示的二叉树作为示例,进行层次遍历演示:
二叉树的层次遍历利用了队列这一结构,把根节点先入队列,之后再出队列,如果根节点有左子树和右子树,则根节点的左子树入队,右子树入队,如此反复直到队列为空为止。
//树的层次遍历
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define MaxSize 100
//typedef int ELemType
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
void CreateTree(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#')
{
T=NULL;
}
else
{
T=new BiTNode;
T->data=ch;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
void Print(BiTree T)
{
if(T)
{
cout<<T->data;
Print(T->lchild);
Print(T->rchild);
}
}
void InorderTraversal(BiTree T)
{
if(T)
{
InorderTraversal(T->lchild);
cout << T->data;
InorderTraversal(T->rchild);
}
}
//层次遍历
void level(BiTree T)
{
int front,rear;
BiTNode *que[MaxSize];
front=rear=0;
BiTNode *q;
if(T)
{
rear=(rear+1)%MaxSize;
que[rear]=T;
while(front !=rear)
{
front=(front+1)%MaxSize;
q=que[front];
cout<<q->data;
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()
{
BiTree T;
cout<<"请输入先序遍历树的结点"<<endl;
CreateTree(T);
cout<<"先序遍历您所建立的树结点"<<endl;
Print(T);
cout<<endl;
cout<<"中序遍历您所建立的树结点"<<endl;
InorderTraversal(T);
cout<<endl;
cout<<"层次遍历您所建立的树结点"<<endl;
level(T);
return 0;
}
运行结果如下: