当前位置:   article > 正文

C++层次遍历(队列结构)_c++遍历队列

c++遍历队列

#include <stdio.h>
#include <malloc.h>
typedef struct ok //树结构 
{
    int data;
    struct ok *lchild;
    struct ok *rchild;
}bittree;
//队列结构 
typedef struct d
{
    int head;  //头 
    int tail;  //尾 
    bittree **data; //数组 
    int size;  //数组长度 
}Queue;
//创建树 
bittree *createTree()
{
    bittree *root=NULL;
    int num;
    scanf("%d",&num);
    if(num>0)
    {
        root=(bittree*)malloc(sizeof(bittree));
        root->data=num;
        root->lchild=createTree();
        root->rchild=createTree();
    }
    return root;
}
//初始化队列 
void init(Queue *queue,int size)
{
    queue->data = (bittree**)malloc(size * sizeof(bittree*)); //定义数组大小 
    queue->head = -1; //这里要设为-1 这又这样才能保证是从索引为0开始的  
    queue->tail = -1; //不然就会输不出来head=tail时候的值 
    queue->size = size;
    for(int i = 0 ; i < size; i++)
    {
        queue->data[i] = NULL;
    }
}
//入队 
void add(Queue *queue,bittree *value)
{
    if(queue->size == 0)
        return ;
    queue->tail = (queue->tail + 1) % queue->size; //重要算法(head +1)%size这是实现循环的关键 
    queue->data[queue->tail] = value;
}
//出队 
bittree *out(Queue *queue)
{
    queue->head = (queue->head +1) % queue->size; 
    bittree* value = queue->data[queue->head];
    return value;
}
//判空 
int isempty(Queue *queue)
{
    return queue->head == queue->tail;
}
//层次遍历 类似前序遍历一 只不过它们用的结构不同 用法是相同的 
void levelVisit(bittree *root)
{
    Queue queue;
    if(root==NULL) return ;
    init(&queue,10);
    add(&queue,root);
    while(!isempty(&queue))
    {
        root=out(&queue);
        printf("%5d",root->data);
        if(root->lchild!=NULL) add(&queue,root->lchild);
        if(root->rchild!=NULL) add(&queue,root->rchild);
    }
}

 

int main()
{
    bittree *root=createTree();
    levelVisit(root);
}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/515108
推荐阅读
相关标签
  

闽ICP备14008679号