三行代码递归实现二叉树层序遍历

三行代码递归实现二叉树层序遍历简述二叉树的层序遍历网上大部分都是使用队列的出队和入队来实现的,这次我用三行代码递归实现二叉树的层序遍历.层序下图是一个简单的二叉树,层序就是一行一行的往下读取,这个二叉树的层序结果便是:1234567(图画的比较丑,强迫症看着难受,看官忍一下)递归分析要想使用递归,必须有两个条件:函数参数类型相同递归必须有出口在二叉树中找到上面的两个条件,与

大家好,又见面了,我是你们的朋友全栈君。

简述

二叉树的层序遍历网上大部分都是使用队列的出队和入队来实现的,这次我用三行代码递归实现二叉树的层序遍历.

层序

下图是一个简单的二叉树,层序就是一行一行的往下读取,这个二叉树的层序结果便是:
1234567

这里写图片描述
(图画的比较丑,强迫症看着难受,看官忍一下)

递归分析

要想使用递归,必须有两个条件:

  1. 函数参数类型相同
  2. 递归必须有出口

在二叉树中找到上面的两个条件,与前中后三种遍历一样,函数参数为节点的,递归出口是当左右孩子为空的时候.传入根节点,然后依次递归访问左右孩子,直至为空.

重点

那么问题来了,递归遍历的数据保存到那?如何做到保存后是层序的顺序?

继续观察这张图
这里写图片描述

第一层
根节点标记为1元素是层序输出的第一个值
第二层
标记为2的元素是层序输出的第二个值,同时他是标记为1节点的左孩子
标记为3的元素是层序输出的第三个元素,同时他是标记为1的节点的右孩子.
第三层
标记为4的元素是输出的第四个元素,他是标记为2节点的左孩子
标记为5的元素是输出的第五个元素,他是标记为2节点的右孩子

很容易找到一个规律:

  • 每一个节点左孩子在层序中输出的位置是该节点在层序输出位置的二倍
  • 每一个节点右孩子在层序中输出的位置是该节点在层序输出位置的二倍加一
  • 根节点在层序输出的位置为1

    也就是:
    假设当前节点输出的位置是i,那么他的左孩子层序输出的位置是2*i,他的右孩子在层序输出的位置为2*i+1

代码实现

根据上面得出的结论,就可以写出层序遍历的递归代码了,知道了节点层序输出的位置,那么遍历时候直接保存到指定位置,等所有节点遍历结束后再统一输出,这个与前中后遍历是不一样的.
既然是根据位置去保存,那么当然是使用数组了,位置就是数组的下标,根据下标进行存放,操作非常方便.

这一段代码,是把字符二叉树层序遍历

int tree2str(bitree *b,char *a,int i)
{
    if(b->left!=NULL)
    {
        tree2str(b->left,a,2*i);
    }
    if(b->right!=NULL)
    {
        tree2str(b->right,a,2*i+1);
    }
    *(a+i)=b->data;
}

注意
参数a为数组的首地址,调用时候传递参数i初始值为1,代表第一层,既就是根界点,当递归函数执行完毕时候,所有的元素都在对应的位置,a[0]元素始终为空,因为是从1开始存放的,所以调用之后输出的时候应该从a+1的位置开始,字符串结束应该是’\0’,输出前补上防错.
这里写图片描述
(本人测试环境:系统Ubuntu16.04LTS 编译器GCC5.4,字符串末尾没有添加’\0’未出错,在vc6.0会出现烫烫烫烫烫烫烫烫烫……)

结束

回到最初,标题说是三行代码,实际上为了看的方便在if函数后面加了花括号,我觉得一行代码的标志应该是一个分号,既一个语句;所以上面的也算是三行代码了.

如果上面的不算三行代码,那就看下面

int tree2str(bitree *b,char *a,int i)
{
    if(b->left!=NULL)       tree2str(b->left,a,2*i);
    if(b->right!=NULL)      tree2str(b->right,a,2*i+1);
    *(a+i)=b->data;
}

好了现在很直观的三行了[完].

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143300.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于Multisim的函数信号发生器–方波、三角波、正弦波[通俗易懂]

    设计要求-基本要求设计制作一个方波-三角波-正弦波信号发生器,供电电源为±12V。(1)输出频率能在1-10KHZ范围内连续可调;(2)方波输出电压Uopp=12V(误差<20%),上升、下降沿小于10us;(3)三角波信号输出电压Uopp=8V(误差<20%);(4)正弦波信号输出电压Uopp≥1V,无明显失真。-提高要求(1)将输出方波改为占空比可调的矩形波,占空比可调范围30%–70%;(2)三种波形的输出峰峰值Uopp均在1~10V范围内连续可调。设计思路-电

    2022年4月15日
    104
  • oracle数据库心得体会_oracle基础知识入门

    oracle数据库心得体会_oracle基础知识入门Oracle的体系太庞大了,对于初学者来说,难免会有些无从下手的感觉,什么都想学,结果什么都学不好,所以把学习经验共享一下,希望让刚刚入门的人对oracle有一个总体的认识,少走一些弯路。  一、定位  oracle分两大块,一块是开发,一块是管理。开发主要是写写存储过程、触发器什么的,还有就是用Oracle的Develop工具做form。有点类似于程序员,需要有较强的逻辑思维和创造能力,

    2022年8月30日
    2
  • PKI体系及常见证书

    PKI体系及常见证书http://blog.chinaunix.net/space.php?uid=23637692&do=blog&id=30579881.PKI体系1.1PKI(PublicKeyInfrastructure,公钥基础架构)PKI是一套以公钥技术为基础、提供安全服务的架构,由认证机构(CA),数字证书库,密钥备份和恢复,证书作废系统,应用接口等组成。CA是PK

    2022年8月22日
    8
  • spider crawled. red bottom shoes「建议收藏」

    Hewasamostnotoriousblasphemer,andhispoweroflanguagewassoextraordinarywhicheverybodyutilizedtod…

    2022年4月10日
    35
  • (一)easyUI之第一个demo

    (一)easyUI之第一个demo一、下载官网下载:http://www.jeasyui.net/download/同时并下载官方中文API文档。解压后的目录结构:二、第一个demo1新建工程并导入包1新建工程并导

    2022年7月2日
    24
  • 安卓app十大开发框架_web应用开发学什么

    安卓app十大开发框架_web应用开发学什么国内第一本基于Android2.0的经典著作,5大专业社区联袂推荐,权威性毋庸置疑!·Android开发与传统的J2ME开发有何相似与不同?·如何通过SharedPreferences、Files、Network和SQLite等方式高效实现Android数据的存储?又如何通过ContentProviders轻松地实现Android数据的共享?·如何使用OpenCore、MediaPlayer、MediaRecorder方便快速地开发出包含音频和视频等流媒体的丰富多媒体应用?·如何

    2022年5月3日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号