• 二叉树层次遍历队列实现


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

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

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

      (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);
        }
    }
    数据库不平,何以平天下,啊啊啊~
  • 相关阅读:
    python — 文件操作
    Android存储
    JAVA 里面 synchronized作用
    UML元素
    ubuntu18.04 命令行安装gradle
    UML时序图
    视觉SLAM中的数学——解方程AX=b与矩阵分解:奇异值分解(SVD分解) 特征值分解 QR分解 三角分解 LLT分解
    现行最小二乘过约束和欠约束如何求解
    SLAM-G2O分析
    自定义Gradle插件
  • 原文地址:https://www.cnblogs.com/hackergodness/p/2485993.html
Copyright © 2020-2023  润新知