佇列實現二叉樹的層序遍歷
阿新 • • 發佈:2019-01-23
首先定義佇列的結構體和方法。佇列使用二維指標儲存指向樹節點的指標。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);
}
總結:當需要層序便利其他非二叉樹時,將節點結構、佇列指標型別、尋找孩子節點的方式進行更改即可。