二叉树的按层遍历法

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

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

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

编程思想:

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


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

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); //按层遍历树

全部完成!

评论 20 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

爱学习的草莓熊

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值