二叉树的层次遍历

所谓层次遍历是指从二叉树的根结点开始从上到下逐层遍历该二叉树,在同一层次中从左到右依次访问各个结点。

由层次遍历的定义可知,层次遍历是从根结点开始访问,然后访问它的左孩子和右孩子,接下来是它左孩子的左孩子和右孩子,右孩子的左孩子和右孩子······。即在访问完某个结点后,一般不能马上访问它的左孩子和右孩子(除根结点等特殊情况外),需要把它的左右孩子信息保存起来。这种方式正好与队列的操作特点吻合,所以可利用一个队列结构来实现层次遍历,其做法是:

(1).首先将根结点入队列

(2).当队列不空,从队列中取出队头结点访问它,并在其左右孩子非空时,把它的左孩子结点和右孩子结点一次入队列。

(3).反复执行(2),知道队列为空时为止。

在下面层次遍历算法中,二叉树以二叉链表存储,用一维数组queue[MAXSIZE]实现循环队列,变量front和rear为分别表示队头指针和队尾指针的指示器变量,并假定有足够空间不会发生上溢。

#define MAXSIZE 100
void levelorder(bitree bt)//层次遍历二叉树
{
    bitree queue[MAXSIZE];//定义队列
    int front,rear;//定义队列指针
    if(bt==NULL) return ;//如果是空树则返回
    front=0; rear=0;//队列指针初始化
    queue[++rear]=bt;//根结点入队列
    while(rear!=front)//当队列不空时反复做
    {
        front=(front+1)%MAXSIZE;//队头结点出队列
        printf("%d\n",queue[front]->data);//访问对头结点,假定为整型
        if(queue[front]->lchild!=NULL)//队头结点的左孩子域不空
        {
            rear=(rear+1)%MAXSIZE;//修改队尾指针
            queue[rear]=queue[front]->lchild;//队头结点的左孩子入队列
        }
        if(queue[front]->rchild!=NULL)
        {
            rear=(rear+1)%MAXSIZE;
            queue[rear]=queue[rear]->rchild;
        }
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值