二叉树的层次遍历 队列
2012-11-17 19:14
399 查看
二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历。在同一层中,则按从左到右的顺序对结点逐个访问。在进行层次遍历时,当前层结点访问完后,再按照它们的访问次序对各个结点的左孩子和右孩子顺序访问,这样一层一层进行,先遇到的结点先访问,这与队列的操作原则比较吻合。因此,在进行层次遍历时,可设置一个队列结构,遍历从二叉树的根结点开始,首先将根结点指针入队列,然后从对列头取出一个元素,每取一个元素,同时执行下面两个操作:
(1)访问该元素所指结点,也就是打印出来;
(2)若该元素所指结点的左、右孩子结点非空,则将该元素所指结点的左孩子指针和右孩子指针顺序入队。
此过程不断进行,当队列为空时,二叉树的层次遍历结束。
关键就是一个出队,一个入队操作。总代码如下:
(1)访问该元素所指结点,也就是打印出来;
DeQueue(Q,x); //先弹出压入队列的节点 printf("%c",(*x)->data);
(2)若该元素所指结点的左、右孩子结点非空,则将该元素所指结点的左孩子指针和右孩子指针顺序入队。
if((*x)->lchild) //同时判断有无左孩子节点,如果存在压入队列 EnQueue(Q,(*x)->lchild); if((*x)->rchild) //再判断有无右孩子节点,如果存在压入队列 EnQueue(Q,(*x)->rchild);
此过程不断进行,当队列为空时,二叉树的层次遍历结束。
while(!QueueIsEmpty(Q)) //非空,一直到全部弹出为止
关键就是一个出队,一个入队操作。总代码如下:
void LayerOrder(BiTree T) { BiTree *x; x = (BiTree*)malloc(sizeof(BiTree)); if(NULL == x) printf("内存分配失败!\n"); LinkQueue *Q; Q = (LinkQueue*)malloc(sizeof(LinkQueue)); InitQueue(Q); //对列初始化 EnQueue(Q,T); //根节点T入栈,先压入根节点 while(!QueueIsEmpty(Q)) //非空,一直到全部弹出为止 { DeQueue(Q,x); //弹出压入的节点 printf("%c",(*x)->data); if((*x)->lchild) //同时判断有无左孩子节点,如果存在压入队列 EnQueue(Q,(*x)->lchild); if((*x)->rchild) //再判断有无右孩子节点,如果存在压入队列 EnQueue(Q,(*x)->rchild); } }
转自:/article/5839778.html
相关文章推荐
- 利用队列层次遍历二叉树
- 二叉树:利用两个队列层次遍历输出指定层数的叶子节点
- 二叉树按层次遍历--队列实现
- 102.LeetCode Binary Tree Level Order Traversal(easy)[二叉树层次遍历 广度搜索 队列]
- 二叉树按层次遍历--队列实现
- 二叉树的层次遍历---队列的使用
- 层次遍历二叉树的方法(递归,队列,指针)
- 二叉树按层次遍历--队列实现
- c语言实现二叉树层次遍历(借助队列实现)
- 采用队列数据结构按层次遍历二叉树
- 数据结构--二叉树--层次遍历二叉树(链式遍历--队列)
- 利用队列实现二叉树的层次遍历
- [二叉树专题]:广度优先:按层次遍历二叉树的非递归实现||使用队列实现层次遍历二叉树
- 二叉树的层次非递归遍历运用队列
- 199.leetcode Binary Tree Right Side View(medium)[层次遍历二叉树 队列]
- 数据结构 — 6.顺序队列(循环)实现二叉树层次遍历
- 二叉树前中后序遍历的递归版本和非递归版本、队列实现的层次遍历
- 数据结构 利用循环队列层次遍历一棵二叉树 递归实现
- 利用队列对二叉树进行层次遍历
- 二叉树层次遍历队列实现