广度优先遍历二叉树(BFS)

 
  1 // 广度优先遍历二叉树(BFS).cpp: 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 
  6 
  7 #include <iostream>
  8 #include <stdio.h>
  9 #include <malloc.h>
 10 #include <stdlib.h>
 11 
 12 using namespace std;
 13 
 14 #define QUEUE_INIT_SIZE 100
 15 typedef char ElemType;
 16 
 17 typedef struct BiNode
 18 {
 19     ElemType data;
 20     struct BiNode *lchild, *rchild;
 21 }BiNode, *BiPtr;
 22 
 23 typedef struct queue
 24 {
 25     int queuesize;   //数组的大小
 26     int head, tail;  //队列的头和尾下标
 27     BiPtr *q;        //数组头指针
 28 }Queue, *QueuePtr;
 29 
 30 int InitQueue(QueuePtr &Q)
 31 {
 32     Q->queuesize = QUEUE_INIT_SIZE;
 33     Q->q = (BiPtr *)malloc(sizeof(BiPtr) * Q->queuesize); //分配内存
 34     Q->tail = 0;//数组下标从0开始,tail始终指向队尾元素的下一个位置
 35     Q->head = 0;//队列非空时,head始终指向队列首元素
 36     return 0;
 37 }
 38 
 39 int EnQueue(QueuePtr Q, BiPtr key)
 40 {
 41     if((Q->tail + 1) % Q->queuesize == Q->head)//取余保证,当quil=queuesize-1时,再转回0,此时队列没有空间                    
 42     {
 43         cout << "队列已满,无法再添加元素!";
 44     }
 45     else
 46     {
 47         Q->q[Q->tail] = key;
 48         Q->tail = (Q->tail + 1) % Q->queuesize;
 49     }
 50     return 0;
 51 }
 52 
 53 BiPtr DeQueue(QueuePtr Q)
 54 {
 55     BiPtr temp;
 56     if (Q->tail == Q->head)     //判断队列不为空
 57     {
 58         cout << "队列为空,无法删除元素!";
 59     }
 60     else
 61     {
 62         temp = Q->q[Q->head];
 63         Q->head = (Q->head + 1) % Q->queuesize;
 64     }
 65     return temp;
 66 }
 67 
 68 int IsQueueEmpty(QueuePtr Q)
 69 {
 70     if (Q->head == Q->tail)//
 71         return 1;
 72     else//非空
 73         return 0;
 74 }
 75 
 76 int IsQueueFull(QueuePtr Q)
 77 {
 78     if ((Q->tail + 1) % Q->queuesize == Q->head)
 79         return 1;
 80     else
 81         return 0;
 82 }
 83 
 84 //---------------------------------------------------
 85 
 86 int Create_BiTree(BiPtr& T)
 87 {
 88     ElemType c;
 89     //cout << "请输入当前节点元素值:" << endl;
 90     cin >> c;
 91     if (c == '#') T = NULL;
 92     else
 93     {
 94         T = new BiNode;
 95         T->data = c;
 96         Create_BiTree(T->lchild);
 97         Create_BiTree(T->rchild);
 98     }
 99     return 0;
100 }
101 
102 //层序遍历
103 int LevelOrderTraverse(BiPtr T)
104 {
105     QueuePtr Q = new Queue;
106     BiPtr p = NULL;
107     InitQueue(Q);
108 
109     EnQueue(Q, T);//根结点入队
110     while (!IsQueueEmpty(Q))
111     {
112         p = DeQueue(Q);
113         cout << p->data << " ";
114         if (p->lchild)//如果p有左孩子,则左孩子入队
115             EnQueue(Q, p->lchild);
116         if (p->rchild)//如果p有右孩子,则左孩子入队
117             EnQueue(Q, p->rchild);
118     }
119     return 0;
120 }
121 
122 int main()
123 {
124     freopen("input2.txt", "r", stdin);//从input.txt中读取输入数据
125     BiPtr T;
126     Create_BiTree(T);
127     LevelOrderTraverse(T);
128     fclose(stdin);
129     return 0;
130 }

 

测试方式和上篇相同

第一组数据的遍历输出结果:A B E C D F 

第二组数据的遍历输出结果:A B J C D K E F G I H

两棵树的结构也和上篇完全一样

另外,循环队列的代码借鉴:http://www.cnblogs.com/kaituorensheng/archive/2013/02/28/2937865.html

posted @ 2017-03-28 18:58  nullxjx  阅读(1435)  评论(0编辑  收藏  举报