搬运工

导航

二叉树层次遍历队列实现

    这念头学艺不精就要被人鄙视,自国外某知名软件公司面试完后,发现学过的全忘脑后了。对着面试官只能“说不知道”,“不好意思,想不起来了”。一点印象都没了,想憋都憋不出来啊。。。

   一个简单的层次遍历,写着写着成了先序遍历。然后就死循环了。关键就是那一点未透——队列。

  二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历。在同一层中,则按从左到右的顺序对结点逐个访问。在进行层次遍历时,当前层结点访问完后,再按照它们的访问次序对各个结点的左孩子和右孩子顺序访问,这样一层一层进行,先遇到的结点先访问,这与队列的操作原则比较吻合。因此,在进行层次遍历时,可设置一个队列结构,遍历从二叉树的根结点开始,首先将根结点指针入队列,然后从对列头取出一个元素,每取一个元素,同时执行下面两个操作:

  (1)访问该元素所指结点,也就是打印出来;

DeQueue(Q,x);  //先弹出压入队列的节点
printf("%c",(*x)->data);

  (2)若该元素所指结点的左、右孩子结点非空,则将该元素所指结点的左孩子指针和右孩子指针顺序入队。

if((*x)->lchild)  //同时判断有无左孩子节点,如果存在压入队列
     EnQueue(Q,(*x)->lchild);
if((*x)->rchild)  //再判断有无右孩子节点,如果存在压入队列
     EnQueue(Q,(*x)->rchild);

  此过程不断进行,当队列为空时,二叉树的层次遍历结束。       

while(!QueueIsEmpty(Q)) //非空,一直到全部弹出为止

      关键就是一个出队,一个入队操作。总代码如下:

void LayerOrder(BiTree T)
{
    BiTree *x;
    x = (BiTree*)malloc(sizeof(BiTree));
    if(NULL == x)
        printf("内存分配失败!\n");

    LinkQueue *Q;
    Q = (LinkQueue*)malloc(sizeof(LinkQueue));
    InitQueue(Q);           //对列初始化
    EnQueue(Q,T);           //根节点T入栈,先压入根节点
    while(!QueueIsEmpty(Q)) //非空,一直到全部弹出为止
    {
        DeQueue(Q,x);       //弹出压入的节点
        printf("%c",(*x)->data);
        if((*x)->lchild)   //同时判断有无左孩子节点,如果存在压入队列
            EnQueue(Q,(*x)->lchild);
        if((*x)->rchild)   //再判断有无右孩子节点,如果存在压入队列
            EnQueue(Q,(*x)->rchild);
    }
}

 

posted on 2012-05-06 15:37  hackergodness  阅读(4074)  评论(1编辑  收藏  举报