【数据结构】二叉树的层次遍历2

#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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值