二叉树的层次遍历

 二叉树进行层次遍历        

如二叉树         A

                 B        C

        D        E         F       G

层次遍历输出ABCDEFG 

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>

typedef struct TreeNode
{
	char data;
	struct TreeNode* lchild;//左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址
	struct TreeNode* rchild;
}TreeNode;

void createTree(TreeNode** T)
{
	char ch;//存放数据
	scanf("%c",&ch);//键盘输入结点数据
	getchar();//scanf之后,随便找个getchar()函数,接收一下回车符,这样缓存里面就没有回车符了
	//接收的回车符也不用管它,咱们的目的是把他接出来,别让他一直在缓存里就行
	if (ch == '#')
	{
		*T = NULL;//如果数据是# 即为空 那么就没有孩子 他的 *T就是结构体的地址 没有就是NULL
	}
	else
	{
		*T = (TreeNode*)malloc(sizeof(TreeNode));//结点不为空 给结构体的指针申请内存
		(*T)->data = ch;//结构体的数据域为 ch
		createTree(&((*T)->lchild));// 取地址  传入 左孩子指针 的地址  进行左孩子结点的创造
		createTree(&((*T)->rchild));//取地址 传入 右孩子指针的地址 进行创造
	}
}

void preOrder(TreeNode* T)
{
	if (T == NULL) 
	{
		return;
	}
	else
	{
		//先办事
		printf("%c ",T->data);
		preOrder(T->lchild);
		preOrder(T->rchild);
	}
}

//代码中如何实现层次遍历
//队的数据结构来实现
//treeleverlTraverse

//创建一个队的结构
//队伍先进先出  进行尾插法
//定义一个双链表

typedef struct QueneNode
{
	TreeNode* data;
	struct QueneNode* pre;
	struct QueneNode* next;
}QueneNode;

QueneNode* initQuene()
{
	QueneNode* Q = (QueneNode*)malloc(sizeof(QueneNode));
		Q->data = NULL;
		Q->next = Q;
		Q->pre = Q;
		return Q;
}

void enQuene(TreeNode* data,QueneNode* Q)
{
	QueneNode* node = (QueneNode*)malloc(sizeof(QueneNode));
	node->data = data;
	node->next = Q;
	node->pre = Q->pre;
	Q->pre->next = node;
	Q->pre = node;
	return node;
}

int isEmpty(QueneNode* Q)
{
	if (Q->next == Q)//头尾相连 
	{
		return 1;
	}
	else {
		return 0;
	}
}

QueneNode* deQuene(QueneNode* Q)
{
	if (isEmpty(Q))
	{
		return NULL;
	}
	else
	{
		QueneNode* node = Q->next;
		Q->next->next->pre = Q;
		Q->next = Q->next->next;
		return node;
	}
}

void levelTraverse(QueneNode* Q, TreeNode* T)
{
		enQuene(T, Q);	
		while (!isEmpty(Q))
		{
			QueneNode* node = deQuene(Q);//接收一个出队结点  
			printf("%c ",node->data->data);// QueneNode的data域 存放的是 树结点 再次->data就是树结点的data
			if (node->data->lchild)//左子树不为空
			{
				enQuene(node->data->lchild, Q);//左结点入队
			}
			if (node->data->rchild)//右节点不为空
			{
				enQuene(node->data->rchild, Q);//右节点入队
			}
		}
}


int main()
{
	TreeNode* T;//创建了一个结构体变量的指针 指向一个结构体变量
	QueneNode* Q = initQuene();
	createTree(&T);//传入结构体指针的地址 即二级指针 来修改结构体变量的地址
	preOrder(T);
	printf("\n");
	levelTraverse(Q,T);
	return 0;
} 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值