二叉树利用队列实现层次遍历

Posted 拉风小宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树利用队列实现层次遍历相关的知识,希望对你有一定的参考价值。

这里先提一句为什么之前树的创建可以由前序遍历的方法搞定,原因是前序遍历的时候把所有的空节点都包含在内了,如果仅仅只有非空节点的前序遍历输入,是无法得到单一二叉树的,例如给出了一个前序遍历顺序AB

那么有可能是两种情况,如下图所示

     A     或者  A

B                        B

甚至给出它的后序遍历也不可以,如果得知两种遍历顺序希望获得唯一的二叉树,至少要给出其中序遍历

转回主题,如何利用队列实现层序遍历呢

队列实现:遍历从根节点开始,首先将根节点入队,然后开始执行循环:结点出队、访问该节点、其左右儿子入队

层序遍历的基本过程是:

先根节点入队,然后:

1.从队列中取出一个元素

2.访问该元素所指的结点

3.若该元素所指结点的左、右孩子结点非空,则将其左、右孩子的指针顺序入队

实现代码如下

#include "stdio.h"  
#include "stdlib.h"    

#define ERROR 0

typedef struct tree
  
    char data;  
    struct tree *lchild;  
    struct tree *rchild;  
 *Ptree; 

typedef Ptree ElementType;

struct Node      
     ElementType Data;      
    struct Node *Next;      
;      
      
struct QNode      
    struct Node *rear;      
    struct Node *front;      
;  
typedef struct QNode *Queue;    

//创建树
Ptree createTree();

//创建队列  
Queue CreateQueue();  
//删除队列头元素  
ElementType DeleteQ(Queue PtrQ);   
//在队尾插入元素  
void InsertQ(ElementType item,Queue PtrQ);  
//判断是否空    
int IsEmpty(Queue Q);  

//利用队列层次遍历
void LevelOrderTraversal(Ptree BT);


void main()  
   
   Ptree t; 
   printf("先序创建二叉树,用空格代表虚结点:\\n");
   t=createTree(); 
   printf("\\n");
   printf("利用队列的层次遍历:\\n");
   LevelOrderTraversal(t);
   printf("\\n");
   system("pause");



 
//树的建立
 Ptree createTree()   
   
     char ch;  
     Ptree t;  
     ch=getchar();  //输入二叉树数据
     if(ch==' ')  //判断二叉树是否为空
         t=NULL;  
     else 
       
         t=(Ptree)malloc(sizeof(Ptree));  //二叉树的生成
         t->data=ch;  
         t->lchild=createTree();  
         t->rchild=createTree();  
       
     return t;  
   

 
//创建队列  
Queue CreateQueue()  
    Queue PtrQ;    
    PtrQ=(Queue)malloc(sizeof(struct QNode));  
    struct Node *rear;  
    struct Node *front;  
    rear =(Node*)malloc(sizeof(struct Node));  
    rear=NULL;  
    front =(Node*)malloc(sizeof(struct Node));  
    front=NULL;  
    PtrQ->front=front;  
    PtrQ->rear=rear;  
    return PtrQ;  
;  

//删除队列头元素 
ElementType DeleteQ(Queue PtrQ)      
    struct Node *FrontCell;      
    ElementType FrontElem;      
      
    if(IsEmpty(PtrQ))      
        printf("队列空");      
        return ERROR;      
        
    FrontCell=PtrQ->front;    
    if(PtrQ->front==PtrQ->rear)    
       PtrQ->front=PtrQ->rear=NULL;    
    else    
        PtrQ->front=PtrQ->front->Next;    
        
      FrontElem=FrontCell->Data;    
      free(FrontCell);    
      return FrontElem;      
      

//在队尾插入元素  
void InsertQ(ElementType item,Queue PtrQ)    
    struct Node *FrontCell;    
    FrontCell=(Node*)malloc(sizeof(struct Node));  
    FrontCell->Data=item;  
    FrontCell->Next=NULL;  
  
    if(IsEmpty(PtrQ))  
        PtrQ->front=FrontCell;  
        PtrQ->rear=FrontCell;  
      
    else  
        PtrQ->rear->Next=FrontCell;  
        PtrQ->rear=FrontCell;  
      
;     

//判断是否空
int IsEmpty(Queue Q)  
     return(Q->front==NULL);    
; 



//利用队列层次遍历
void LevelOrderTraversal(Ptree BT)

	Queue Q;
	Ptree T;
	if(!BT) return;
	Q=CreateQueue();
	T=BT;
	InsertQ(T,Q);
	while(!IsEmpty(Q))
		T=DeleteQ(Q);
		printf("%c",T->data);
		if(T->lchild) InsertQ(T->lchild,Q);
		if(T->rchild) InsertQ(T->rchild,Q);
	
;
二叉树和之前的一样

                 A

       B                  C

D         F      G           I

         E             H


执行效果如下



以上是关于二叉树利用队列实现层次遍历的主要内容,如果未能解决你的问题,请参考以下文章

数据结构——链队列实现二叉树的层次遍历

C++ 实现二叉树的非递归层次遍历(队列实现)

二叉树的层次遍历

二叉树层次遍历(包含C语言实现代码)

二叉树的层次遍历

基于二叉树的层次遍历算法分析