【算法导论】二叉树的广度优先遍历

来源:互联网 发布:java怎么计算时间差 编辑:程序博客网 时间:2024/06/06 05:48

二叉树的广度优先遍历

广度优先遍历:又称按层次遍历,也就是先遍历二叉树的第一层节点,然后遍历第二层节点……最后遍历最下层节点。而对每一层的遍历是按照从左至右的方式进行的。
基本思想:按照广度优先遍历的方式,上一层中先被访问的节点,它的下层孩子也必然先被访问,因此在算法实现时,需要使用一个队列。在遍历进行之前先把二叉树的根结点的存储地址入队,然后依次从队列中出队结点的存储地址,每出队一个结点的存储地址则对该结点进行访问,然后依次将该结点的左孩子和右孩子的存储地址入队,如此反复,直到队空为止。
具体算法如下:
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define maxsize 20typedef int datatype;typedef struct node{datatype data;struct node *lchild,*rchild;}bitree;void Layer(bitree *p);bitree* CreatBitree(int* arrayA,int n);int countleaf(bitree *p);int treedepth(bitree*p,int l);void main(){int arrayA[10]={0,1,2,3,4,5,6,7,8,9};//第一个节点没有用于存储数据int n=sizeof(arrayA)/sizeof(int);    int l=0;//二叉树的深度bitree *head=NULL;head=CreatBitree(arrayA,n);printf("按广度优先搜索遍历的结果为:");Layer(head);printf("\n");}/**************************************************\函数功能:二叉树的广度优先遍历输入:二叉树的根节点输出:无\**************************************************/void Layer(bitree *p){bitree* queue[maxsize];//queue数组用于存储节点地址bitree* s;int rear=0;  //队列尾指针int front=0; //队列头指针if(p!=NULL)//输入的树不为空{rear=1; //初始化front=0;queue[rear]=p;while(front<rear)//判断队列是否为空{front++;s=queue[front];printf("%d ",s->data);if(s->lchild!=NULL) //存储左右子节点{rear++;queue[rear]=s->lchild;}if(s->rchild!=NULL){rear++;queue[rear]=s->rchild;}}}}/*************************************************\函数功能:建立二叉树(按照顺序方式)输入:    原始数组输出:    二叉树的头结点\*************************************************/bitree* CreatBitree(int* arrayA,int n)//顺序存储 建立二叉树{bitree *root;bitree *queue[maxsize];bitree *p;int front,rear;front=1;rear=0;root=NULL;for(int i=1;i<n;i++){p=(bitree*)malloc(sizeof(bitree));p->data=arrayA[i];p->lchild=NULL;p->rchild=NULL;rear++;queue[rear]=p;if(rear==1)root=p;else{if(i%2==0)queue[front]->lchild=p;else{queue[front]->rchild=p;front=front+1;}}}return root;}
注:如果程序出错,可能是使用的开发平台版本不同,请点击如下链接: 解释说明


原文:http://blog.csdn.net/tengweitw/article/details/9791453

作者:nineheadedbird



原创粉丝点击