在二叉树的遍历当中,有一种遍历方法是不常见的,那就是广度遍历。和其他三种遍历方法不同,二叉树的广度遍历需要额外的数据结构来帮助一下?什么数据结构呢?那就是队列。因为队列具有先进先出的特点,这个特点要求我们在遍历新的一层数据之前,必须对上一次的数据全部遍历结束。暂时还没有掌握队列知识的朋友可以看一看我的这一篇博客—队列。原文
//树的节点
typedef struct TREE_NODE
{
int data;
struct TREE_NODE*lchild,*rchild;
}TREE_NODE
//队列数据结构,pHead表示指针的起始地址
typedef struct _QUEUE
{
int head;
int tail;
int length;
TREE_NODE**pHead;
}QUEUE;
//创建队列
QUEUE* create_queue_for_tree(const TREE_NODE*pTreeNode)
{
QUEUE* pQueue;
int count; //记录节点个数,即树的节点个数
if(NULL==pTreeNode)
return NULL;
count=count_all_node_number(pTreeNode);
pQueue=(QUEUE*)malloc(sizeof(QUEUE));
assert(NULL!=pQueue);
memset(pQueue,0,sizeof(QUEUE));
pQueue->pHead=(TREE_NODE**)malloc(sizeof(TREE_NODE*)*count);
assert(NULL!=pQueue->pHead);
memset(pQueue->pHead,0,sizeof(TREE_NODE*)*count);
pQueue->head=pQueue->tail=0;
pQueue->length=count;
return pQueue;
}
//实现队列的数据加入和数据弹出操作
void insert_node_into_queue(QUEUE*pQueue,TREE_NODE*pNode)
{s
if(NULL==pQueue || NULL==pQueue->pHead ||NULL==pNode)
return;
pQueue->pHead[pQueue->tail++]=pNode;
return;
}
TREE_NODE* get_node_from_queue(QUEUE* pQueue)
{
if(NULL==pQueue || NULL==pQueue->pHead)
return NULL;
if(pQueue->head==pQueue->tail)
return NULL;
return pQueue->pHead[pQueue->head++];
}
s