1. 程式人生 > >佇列實現二叉樹的層序遍歷

佇列實現二叉樹的層序遍歷

首先定義佇列的結構體和方法。佇列使用二維指標儲存指向樹節點的指標。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);
}

總結:當需要層序便利其他非二叉樹時,將節點結構、佇列指標型別、尋找孩子節點的方式進行更改即可。