列は二叉の木の階層を巡回することを実現します.
3793 ワード
キューの構造体と方法を最初に定義します.キューは、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);
}
まとめ:他の非二叉樹を階層的に便利にする必要がある場合、ノード構造、キューポインタタイプ、子供ノードを探す方式を変更すればいいです.