建立二叉树,实现二叉树的层序遍历
2017-10-29 02:30
501 查看
用到队列来辅助实现,从左向右,自上而下,依次将二叉树的各节点入队,这样便可以保证输出的顺序是层序排列的。
/* * Created by Microsoft Visual Studio 2013 * @author: Teresa * @date: 2017-10-24 * @description: 二叉树遍层序遍历 */ #include <stdio.h> #include <stdlib.h> /*函数状态码*/ #define TRUE 1 //成功 #define OK 1 #define FALSE 0 //失败 #define ERROR 0 //错误 #define INFEASIBLE -1 //不可行的 #define OVERFLOW -2 //溢出 #define MAXSIZE 100 typedef int Status; //函数的返回值类型 typedef char TElemType; /* 二叉链表表示的二叉树 */ typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; typedef BiTree QElemType; typedef struct { QElemType data[MAXSIZE]; int front, rear; // 分别存放队头和队尾的位置 } SqQueue, *SqQueuePtr; Status PrintElement(TElemType e){ putchar(e); return OK; } //按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,构造二叉链表表示的二叉树T。 Status CreatBiTree(BiTree *T){ char ch; scanf("%c", &ch); //如果当前输入的字符为空格,则(*T)指向空树。 if (ch == ' '){ (*T) = NULL; } else{ if (!((*T) = (BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW); (*T)->data = ch; //生成根结点 CreatBiTree(&((*T)->lchild)); //构造左子树 CreatBiTree(&((*T)->rchild)); //构造右子树 } return OK; } //初始化队列 void InitQueue(SqQueuePtr Q) { Q->front = 0; Q->rear = 0; } //判断队列空 int QEmpty(SqQueuePtr Q) { return (Q->front == Q->rear); } //判断队列满 int QFull(SqQueuePtr Q){ return ((Q->rear + 1) % MAXSIZE == Q->front); } //从队尾入队列 Status EnQueue(SqQueuePtr Q, QElemType e){ if(QFull(Q)) //队列满则返回错误 return ERROR; Q->data[Q->rear++] = e; return OK; } //从队头出队列 Status DeQueue(SqQueuePtr Q, QElemType *e){ if(QEmpty(Q)) return ERROR; //队列空则返回错误 *e = Q->data[Q->front++]; return OK; } //层序遍历二叉树 void LevelTraverse(BiTree T,Status(*Visit)(TElemType e)) { SqQueuePtr queue; queue = (SqQueuePtr)malloc(sizeof(SqQueue)); InitQueue(queue); /*将二叉树的根结点入队列 *将队头元素出队列 *并将队头元素的左子树的根结点(非空)右子树的根结点(非空)分别入队列 *重复 直至队列中没有元素 */ EnQueue(queue, T); QElemType tmp; while(!QEmpty(queue)) { DeQueue(queue, &tmp); Visit(tmp->data); if(tmp->lchild) EnQueue(queue, tmp->lchild); if(tmp->rchild) EnQueue(queue, tmp->rchild); } } int main(){ BiTree T; CreatBiTree(&T); LevelTraverse(T,PrintElement); return 0; }
相关文章推荐
- 二叉树的建立及层序遍历的实现
- c语言实现二叉树的建立与前序、中序、后序、层序遍历
- 二叉树的创建,先序、中序、后序遍历的递归实现以及层序遍历
- 数据结构——二叉树的建立和遍历(递归建树&层序遍历建树)
- 二叉树建立和遍历,(数据结构清华大学版130页遍历实现)
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- C语言实现二叉树的建立、遍历以及表达式的计算
- 二叉树采用二叉链表结构表示。设计并实现如下算法:输入某棵二叉树的广义表形式,建立该二叉树,并按层次遍历该二叉树。
- Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
- 二叉树的层序遍历算法实现
- 【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】
- 实现一颗二叉树的层序遍历
- C++实现二叉树 前序遍历, 后序遍历, 中序遍历, 层序遍历(不用递归)
- 二叉树的递归、非递归及层序遍历的Java实现
- 二叉树的建立删除及三种遍历实现
- python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)
- C语言实现二叉树的建立、遍历以及表达式的计算
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- 二叉树的遍历(前序、中序、后序、层序),递归和非递归实现
- 二叉树的遍历(先、中、后、层序)C实现