队列实现二叉树的层序遍历

首先定义队列的结构体和方法。队列使用二维指针保存指向树节点的指针。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);
}

总结:当需要层序便利其他非二叉树时,将节点结构、队列指针类型、寻找孩子节点的方式进行更改即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值