二叉树的层次遍历

什么是层次?

数是一个天然的分层形式。层次遍历就是每一层从左到右遍历。二叉树的层次遍历就像树的非递归遍历一样的感觉,是使用循环队列做的。

难点:如何吧递归转换成线性的队列操作。

知识点:

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值