列は二叉の木の階層を巡回することを実現します.


キューの構造体と方法を最初に定義します.キューは、2次元ポインタを使用して、ツリーノードへのポインタを保存します.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);
}
まとめ:他の非二叉樹を階層的に便利にする必要がある場合、ノード構造、キューポインタタイプ、子供ノードを探す方式を変更すればいいです.