首先定义队列的结构体和方法。队列使用二维指针保存指向树节点的指针。i,j为指向队列开头、结尾元素的游标。
struct QueueBTree
{
int i, j;
BTreeNode **queue; //存放的指针类型
};
typedef struct QueueBTree QueueBTree;
QueueBTree * initQueueBTree()
{
//分配一个队列空间
QueueBTree *btree = (QueueBTree *)malloc(sizeof(QueueBTree));
//分配M个树节点指针空间
btree->queue = (BTreeNode **)malloc(sizeof(BTreeNode *)*M);
btree->i = 0;
btree->j = 0;
return btree;
}
void freeQueueBTree(QueueBTree *btree) //释放分配空间
{
free(btree->queue);
free(btree);
}
void addQueueBTree(QueueBTree *btree, BTreeNode *node) //加入队列
{
if(btree->j == M) //队列已满
return;
btree->queue[btree->j] = node;
btree->j++;
}
BTreeNode * delQueueBTree(QueueBTree *tree)
{
if(tree->i == tree->j) //队列已空
return NULL;
BTreeNode *node = tree->queue[tree->i];
tree->i++;
return node;
}
int emptyQueueBTree(QueueBTree *tree)
{
return tree->i==tree->j; //1空
}
这里的二叉树使用节点进行表示而不是数组。节点结构如下:
struct BTreeNode
{
char data;
struct BTreeNode *lchild, *rchild;
};
typedef struct BTreeNode BTreeNode;
层序遍历输出二叉树。
void iterator(BTreeNode *root)
{
if(root == NULL)
return;
QueueBTree *queue = initQueueBTree();
addQueueBTree(queue, root);
while(emptyQueueBTree(queue) == 0)
{
BTreeNode *p = delQueueBTree(queue);
printf("%c ", p->data);
//寻找孩子节点的方式
if(p->lchilds != NULL)
{
addQueueBTree(queue, p->lchild);
}
if(p->rchilds != NULL)
{
addQueueBTree(queue, p->rchild);
}
}
freeQueueBTree(queue);
}
总结:当需要层序便利其他非二叉树时,将节点结构、队列指针类型、寻找孩子节点的方式进行更改即可。