二叉树进行层次遍历
如二叉树 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;
}