#include<stdio.h>
#include<stdlib.h>
typedef char DataType;
//树结点的数据类型定义
typedef struct BTnode{
DataType data;
struct BTnode* lchild,*rchild;
}BTree;
//队列的结点数据类型定义
typedef struct node{
BTree * tdata; //存放树结点类型的指针
struct node *next;
}qnode;
//队头指针 和 队尾指针
typedef struct {
qnode *front,*rear;
}linkQueue;
//初始化队列
void Init(linkQueue *q)
{
q->front=q->rear=NULL;
}
//元素入队
void InsertQueue(linkQueue * &q,BTree * e)
{
qnode * node;
node=(qnode*)malloc(sizeof(qnode));
node->tdata=e;
node->next=NULL;
if(NULL==q->front)
{
q->front=q->rear=node;
}
else
{
q->rear->next=node;
q->rear=node;
}
}
//元素出队
BTree * outQueue(linkQueue * &q)
{
BTree * e;
qnode *temp;
if(NULL==q->front)
e=NULL;
else
{
temp=q->front;
e=temp->tdata;
q->front=temp->next;
free(temp);
}
return e;
}
//创建二叉树,以先序的方式输入,如果左孩子或右孩子为空,则输入#
/*
例子 A 输入为:ABD##E##CF###
/ \
B C
/ \ /
D E F
*/
void createBTree(BTree * &t)
{
char c;
c=getchar();
if(c=='#')
t=NULL;
else
{
t=(BTree*)malloc(sizeof(BTree));
t->data=c;
createBTree(t->lchild);//创建左子树
createBTree(t->rchild);//创建右子树
}
}
/*
二叉树的层次遍历算法:
1.队列queue初始化;
2. 将根指针入队;
3. 循环直到队列queue为空
3.1 q=队列queue出队的元素;
3.2 访问结点q的数据域;
3.3 若结点q存在左孩子,则将左孩子入队;
3.4 若结点q存在右孩子,则将右孩子入队;
*/
//二叉树的层次遍历
void hierarchyTtraversal(linkQueue *queue,BTree * root)
{
BTree *q;
InsertQueue(queue,root);
while(NULL!=queue->front)
{
q=outQueue(queue);
printf("%c ",q->data);
if(q->lchild)
InsertQueue(queue,q->lchild);
if(q->rchild)
InsertQueue(queue,q->rchild);
}
}
int main()
{
BTree *root;
linkQueue queue;
Init(&queue);
createBTree(root);
hierarchyTtraversal(&queue,root);
printf("\n");
return 0;
}
【数据结构】二叉树的层次遍历2
最新推荐文章于 2024-09-06 10:12:01 发布