什么是层次?
数是一个天然的分层形式。层次遍历就是每一层从左到右遍历。二叉树的层次遍历就像树的非递归遍历一样的感觉,是使用循环队列做的。
难点:如何吧递归转换成线性的队列操作。
知识点:
1.对列的功能
2.新建树的功能
因为尾入头出,所以尾插法【尾入】。为了方便我们设置双链表【按照循环双链表的原理写的代码,没有这个基础的铁子记得自己搞懂,当然我自己也写了关于这个的原理,详见:(2条消息) 双链表的操作【和循环双链表操作】_薄荷糖yh的博客-CSDN博客】。
算法:
1.顺序访问结点使元素出队
2.访问当前出队结点的左右孩子,使其入队
3.循环1,2直到出完树中的所有元素
相关操作:
1.实现队功能
2.实现树功能
主要算法(如下):
void levelTraverse(QueneNode* Q,TreeNode* T)
{
inQuene(Q,T);
while(!isEmpty(Q)){ //注意while的判断条件容易写错
QueneNode* node= outQuene(Q);
printf("%c\t",node->data->data);
if(node->data->lchild){
inQuene(Q,node->data->lchild);
}
if(node->data->rchild){
inQuene(Q,node->data->rchild);
}
}
}
详细算法:
/*二叉树的层次遍历*/
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode{
char data;
struct TreeNode* lchild;
struct TreeNode* rchild;
}TreeNode;
//双链表实现的队
typedef struct QueneNode{
TreeNode* data;
struct QueneNode* pre;
struct QueneNode* next;
}QueneNode;
//创建树
void createTree(TreeNode** T,char* data,int* index)
{
char ch;
ch=data[*index];
*index+=1;
if(ch=='#'){
*T=NULL;
}else{
*T=(TreeNode*)malloc(sizeof(TreeNode));
(*T)->data=ch;
createTree(&(*T)->lchild,data,index);
createTree(&(*T)->rchild,data,index);
}
}
//先序遍历
void preoder(TreeNode* T)
{
if(T==NULL){
return;
}else{
printf("%c\t",T->data);
preoder(T->lchild);
preoder(T->rchild);
}
}
QueneNode* initQuene()
{
QueneNode* Q=(QueneNode*)malloc(sizeof(QueneNode));
Q->data=NULL;
Q->next=Q;
Q->pre=Q;
return Q;
}
//尾插
void inQuene(QueneNode* Q,TreeNode* data)
{
QueneNode* node=(QueneNode*)malloc(sizeof(QueneNode));
node->data=data;
//尾入
node->pre=Q->next; //node->pre=Q;??
node->next=Q;
Q->pre->next=node;
Q->pre=node;
Q->data++;
}
//判断队列是否空
int isEmpty(QueneNode* Q)
{
if(Q->next==Q){
return 1;
}else return 0;
}
//出队
QueneNode* outQuene(QueneNode* Q)
{
if(isEmpty(Q)){
return NULL;
}else{
//头出【首元结点出】,不用释放,这个代码是遍历用的
QueneNode* node=Q->next;
Q->next=node->next;
node->next->pre=Q;
Q->data--;
return node;
}
}
//具体算法
void levelTraverse(QueneNode* Q,TreeNode* T)
{
inQuene(Q,T);
while(!isEmpty(Q)){ //注意while的判断条件容易写错
QueneNode* node= outQuene(Q);
printf("%c\t",node->data->data);
if(node->data->lchild){
inQuene(Q,node->data->lchild);
}
if(node->data->rchild){
inQuene(Q,node->data->rchild);
}
}
}
int main(){
TreeNode* T;
QueneNode* Q=initQuene();
int index=0;
char data[50]={
"ABD##E##CF##G##"
};
createTree(&T,data,&index);
preoder(T);
printf("hhhhh\n");
levelTraverse(Q,T);
printf("\n");
return 0;
}