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

三行代码递归实现二叉树层序遍历简述二叉树的层序遍历网上大部分都是使用队列的出队和入队来实现的,这次我用三行代码递归实现二叉树的层序遍历.层序下图是一个简单的二叉树,层序就是一行一行的往下读取,这个二叉树的层序结果便是: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)
上一篇 2022年5月21日 下午10:40
下一篇 2022年5月21日 下午10:40


相关推荐

  • 节前最终一波实测,智谱最新模型GLM-4.6

    节前最终一波实测,智谱最新模型GLM-4.6

    2026年3月12日
    1
  • pycharm中安装opencv2_starter安装报错

    pycharm中安装opencv2_starter安装报错图像处理新人,想练习一下opencv库在PyCharm终端pipinstallopencv-python显示安装失败!!!查看了一下竟然是因为BOSEInterpreter是Anaconda去官网上下载了个python解释器就好了!!!给自己提个醒吧!

    2022年8月25日
    8
  • jadxgui反编译教程_apktool工具反编译apk

    jadxgui反编译教程_apktool工具反编译apk可以直接在GitHub上:https://github.com/skylot/jadx.git找到反编译工具jadx-gui源码,在windows电脑:(电脑上已经有git命令工具)gitclonehttps://github.com/skylot/jadx.git然后打开cmd命令窗口:进入到gitclone下来的文件所在的文件路径下,cdE:\jadx之后运行:gra…

    2025年7月30日
    11
  • python格式化json文件_pycharm对齐线

    python格式化json文件_pycharm对齐线1.json文件保存将数据保存为json格式,并存储到.json文件中,需要注意键值对均用双引号,而非单引号。样例如下所示:{“sampleDB”:{“shippedVsCustDemand”:[{“CUSTOMER”:”customer1″,”ITEM”:”desk”,”SUPPLIEDQTY”:25,”DEMANDQTY”:3},{“CUSTOMER”:”customer1″,”ITEM”:”drawer”,”SUPPLIEDQTY”:15,”DEMANDQTY”:

    2022年8月25日
    8
  • 百度mp3接口

    百度mp3接口

    2021年12月17日
    64
  • 详解Harris角点检测及代码实现

    详解Harris角点检测及代码实现转自 http blog csdn net dandan 397 article details 首先 我们不禁要问什么是 harris 角点 nbsp nbsp nbsp nbsp 对于角点 到目前为止还没有明确的数学定义 但是你可以认为角点就是极值点 即在某方面属性特别突出的点 一般的角点检测都是对有具体定义的 或者是能够具体检测出来的兴趣点的检测 这意味着兴趣点可以是角点 是

    2026年3月26日
    2

发表回复

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

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