zoukankan      html  css  js  c++  java
  • 二叉树的按层遍历法

    摘自:https://blog.csdn.net/lingchen2348/article/details/52774535

    程序自己写的,肯定能运行,代码啰不啰嗦暂且不考虑了。

    程序功能:【实现二叉树的按层遍历法】

    编程关键点:【建立一个队列】【函数递归】

    编程思想:

    二叉树分好多层,因为要按层遍历,所以如果直接采用函数递归的话,一下子就深入层底了,达不到按层的目的。

    所以要换一个角度,按照队列顺序输出!算法步骤如下:

    1、把根节点A放入队列,此时队列为:A,队列头指针指向A,也就是队列第一个元素

    2、把当前队列头指针所指元素的左右儿子放入队列,即将B C放入队列,此时队列为A B C ,队列头指针向下移一格,此时指向B

    3、不断重复2步骤。此时把B的左右儿子取出来放入队尾,队列变为A B C D E,队列头指针后移,指向c,c没有子节点,队列不再延长;

    4、结束条件,队列头指针和为指针重合时,输出最后一个元素,算法结束!

    也就是说,把这个队列从头到尾输出一遍,就是按层遍历,这个队列是动态的,只要有子节点,子节点就会不停的加入队尾,但总有子节点没有的时候,所以,队列尾指针肯定有不再移动的时候,而头指针一直在一步一步向下移,总会有首尾指针重合的时候,即标志着算法结束。

    具体步骤:

    1、定义一个二叉树结构

    typedef struct binode
    {
        char data;
        struct binode * lchild;
        struct binode * rchild;
    }BiTree;

    2、前序建立二叉树

    BiTree * CreatBiTree()
    {    
        BiTree *T;
        char data;
        fflush(stdin);
        scanf("%c",&data);
        if(data=='#')T=NULL;
        else
        {
            T=(BiTree *)malloc(sizeof(BiTree));
            T->data=data;
            T->lchild=CreatBiTree();
            T->rchild=CreatBiTree();
        }
        return T;       
    }

    3、按层遍历二叉树

    void Layer_order(BiTree * TNode,BiTree ** F,BiTree ** R)
    {
        
        *F=TNode;            //将当前节点放入队列首指针所指位置
        printf("%c    ",(*F)->data);
        if((*F)->lchild!=NULL)
        {
        R=R+1;
        *R=(*F)->lchild;    //节点的左儿子放入队尾
        }
        if((*F)->rchild!=NULL)
        {
        R=R+1;                //首指针向后移动一格
        *R=(*F)->rchild;    //节点的右儿子放入队尾        
        }
      
        if(F!=R)

        {

         F=F+1;

         Layer_order(*F,F,R);//递归

        }  
      

    }

    4、写main函数,建立一个队列,长度1024,存放节点指针(其实就是一个存放指针的数组),这一部分放在main函数中,这个队列是唯一的,不参与递归
        BiTree ** F;             //队首指针       指向指针的指针,因为队列数组里的元素全是指针
        BiTree ** R;            //队尾指针
        BiTree * Queue[1024];//队列数组
        F=Queue;
        R=Queue;            //开始时队首队尾指针重合

    BiTree * root;      //在main函数中建立一个二叉树根的指针

    root=CreatBiTree();      //创建树

    Layer_order(root,F,R); //按层遍历树

    全部完成!

  • 相关阅读:
    前端工程师入门的阶段
    学习能力与思考能力
    翻译 前端面试题目
    css规范
    html规范
    javascript中apply、call和bind的区别
    Javascript高级程序设计学习笔记一
    css学习笔记四
    [LC] 23. Merge k Sorted Lists
    [LC] 234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/13695623.html
Copyright © 2011-2022 走看看