• 数据结构36:二叉树层次遍历


    前边介绍了二叉树的先序、中序和后序的遍历算法,运用了栈的数据结构,主要思想就是按照先左子树后右子树的顺序依次遍历树中各个结点。


    本节介绍另外一种遍历方式:按照二叉树中的层次从左到右依次遍历每层中的结点。具体的实现思路是:通过使用队列的数据结构,从树的根结点开始,依次将其左孩子和右孩子入队。而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后顺序就是层次遍历的最终结果。

    图1 二叉树

    层次遍历的实现过程

    例如,层次遍历图 1 中的二叉树:
    • 首先,根结点 1 入队;
    • 根结点 1 出队,出队的同时,将左孩子 2 和右孩子 3 分别入队;
    • 队头结点 2 出队,出队的同时,将结点 2 的左孩子 4 和右孩子 5 依次入队;
    • 队头结点 3 出队,出队的同时,将结点 3 的左孩子 6 和右孩子 7 依次入队;
    • 不断地循环,直至队列内为空。

    实现代码

    #include <stdio.h>
    #define TElemType int
    //初始化队头和队尾指针开始时都为0 int front=0, rear=0; typedef struct BiTNode
    {   TElemType data;  
    //数据域   struct BiTNode *lchild, *rchild;  //左右孩子指针 }BiTNode, *BiTree;
    void CreateBiTree(BiTree *T)
    {   
    *T = (BiTNode*)malloc(sizeof(BiTNode));   (*T)->data = 1;   (*T)->lchild = (BiTNode*)malloc(sizeof(BiTNode));   (*T)->rchild = (BiTNode*)malloc(sizeof(BiTNode));   (*T)->lchild->data = 2;   (*T)->lchild->lchild = (BiTNode*)malloc(sizeof(BiTNode));   (*T)->lchild->rchild = (BiTNode*)malloc(sizeof(BiTNode));   (*T)->lchild->rchild->data = 5;   (*T)->lchild->rchild->lchild = NULL;   (*T)->lchild->rchild->rchild = NULL;   (*T)->rchild->data = 3;   (*T)->rchild->lchild = (BiTNode*)malloc(sizeof(BiTNode));   (*T)->rchild->lchild->data = 6;   (*T)->rchild->lchild->lchild = NULL;   (*T)->rchild->lchild->rchild = NULL;   (*T)->rchild->rchild = (BiTNode*)malloc(sizeof(BiTNode));   (*T)->rchild->rchild->data = 7;   (*T)->rchild->rchild->lchild = NULL;   (*T)->rchild->rchild->rchild = NULL;   (*T)->lchild->lchild->data = 4;   (*T)->lchild->lchild->lchild = NULL;   (*T)->lchild->lchild->rchild = NULL; }
    //入队函数 void EnQueue(BiTree *a, BiTree node)
    {   a[rear
    ++] = node; }
    //出队函数 BiTNode *DeQueue(BiTNode **a)
    {   
    return a[front++]; }
    //输出函数 void displayNode(BiTree node)
    {   printf(
    "%d", node->data); }
    int main()
    {   BiTree tree;   
    //初始化二叉树   CreateBiTree(&tree);   BiTNode *p;   //采用顺序队列,初始化创建队列数组   BiTree a[20];   //根结点入队   EnQueue(a, tree);   //当队头和队尾相等时,表示队列为空   while(front<rear)
      {     
    //队头结点出队     p = DeQueue(a);     displayNode(p);     //将队头结点的左右孩子依次入队     if (p->lchild != NULL)
        {       EnQueue(a, p
    ->lchild);     }     if (p->rchild != NULL)
        {       EnQueue(a, p
    ->rchild);     }   }
      
    return 0; }
    运行结果:
    1 2 3 4 5 6 7
  • 相关阅读:
    sql
    字符和字符串处理例子
    如何用火狐设置代理
    数组指针的一个小例子
    (转)数组指针和指针数组的区别
    函数
    (转)C语言指针5分钟教程
    通俗版解释网关,IP地址,ARP欺骗,DDOS攻击
    计算网络地址
    计算机网络性能指标
  • 原文地址:https://www.cnblogs.com/ciyeer/p/9044595.html
Copyright © 2020-2023  润新知