二叉树利用队列实现层次遍历
来源:互联网 发布:贵人出门多逢雨 知乎 编辑:程序博客网 时间:2024/05/22 04:48
这里先提一句为什么之前树的创建可以由前序遍历的方法搞定,原因是前序遍历的时候把所有的空节点都包含在内了,如果仅仅只有非空节点的前序遍历输入,是无法得到单一二叉树的,例如给出了一个前序遍历顺序AB
那么有可能是两种情况,如下图所示
A 或者 A
B B
甚至给出它的后序遍历也不可以,如果得知两种遍历顺序希望获得唯一的二叉树,至少要给出其中序遍历
转回主题,如何利用队列实现层序遍历呢
队列实现:遍历从根节点开始,首先将根节点入队,然后开始执行循环:结点出队、访问该节点、其左右儿子入队
层序遍历的基本过程是:
先根节点入队,然后:
1.从队列中取出一个元素
2.访问该元素所指的结点
3.若该元素所指结点的左、右孩子结点非空,则将其左、右孩子的指针顺序入队
实现代码如下
#include "stdio.h" #include "stdlib.h" #define ERROR 0typedef 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
1 0
- 二叉树利用队列实现层次遍历
- 数据结构-----层次遍历二叉树算法(利用队列实现)
- 利用队列实现二叉树的层次遍历
- 二叉树按层次遍历--队列实现
- 二叉树按层次遍历--队列实现
- 二叉树按层次遍历--队列实现
- 二叉树层次遍历(借助队列实现)
- 队列实现按层次遍历二叉树
- 数据结构 利用循环队列层次遍历一棵二叉树 递归实现
- 利用队列进行二叉树的层次遍历
- 使用队列实现二叉树按层次遍历(C++)
- leetcode_107. Binary Tree Level Order Traversal II 二叉树层次遍历,利用python的list特性实现队列功能
- 二叉树层次遍历与链队列
- 二叉树的层次遍历 队列
- 二叉树:利用两个队列层次遍历输出指定层数的叶子节点
- [二叉树专题]:广度优先:按层次遍历二叉树的非递归实现||使用队列实现层次遍历二叉树
- c语言实现二叉树层次遍历(借助队列实现)
- 中序二叉树、队列实现层次遍历、中序线索二叉树的创建与遍历
- 我的第一篇CSDN博客
- android音频降噪webrtc
- 【游戏设计模式】之四 《游戏编程模式》全书内容提炼总结
- Ubuntu16.04下安装sublime text3并配置anaconda插件
- 华山论剑之契约式编程与防御式编程
- 二叉树利用队列实现层次遍历
- WiFi 网络也可以这么玩
- [置顶] 浅谈我为什么选择用Retrofit作为我的网络请求框架
- 软件工程(C编码实践篇)学习总结
- leetcode-17. Letter Combinations of a Phone Number
- 软件工程C编码实践课程总结
- 沃通的证书受到质疑,StartCom CA 受处罚
- C/C++初学者项目开发实践1
- 软件工程(C编码实践篇)学习总结