递归在树的深度遍历中的运用

news2024/10/7 6:37:39

树的深度遍历

对于树这种数据结构,之前一直使用的是层次遍历,也就是广度优先搜索的方式(BFS);对于树的遍历,还可以进行深度优先搜索(DFS)

而结合递归,树的深度优先搜索便能够很容易让人记住,面试官往往不会考简单的使用递归实现树的深度遍历,因此,除了使用递归方法外,非递归方式实现树的遍历也需要掌握(下期讲解)。

理解树的前中后序遍历

        深度优先遍历有  前 中 后 序 三种情况。和广度优先搜索一样,前中后序的遍历都主要看的是中间节点(根节点)的位置。

        通过二叉树的角度看递归。每次遇到递归,主要按照前面说的三步来写(或者加上第四步的验证)。递归只能处理当前层与下一层之间的关系,并不关心下层与下下层的关系。具体来说,有以下三步来分解递归:

  • 从小到大递推,找出递推公式
  • 分情况讨论,明确终止条件
  • 结合递推公式 + 终止条件,写出完整方法
  • (从大到小画图验证)

前序遍历

从小到大递推,找出递推公式

以下述二叉树为例:

                3

               /   \

             9    20

                   /    \

                15      7

先选择一个最小的子树:

                20

                /   \

              15   7

如果root为20,则此时前序访问顺序就是:

void visit(){ 

        list.add(root); // 20被访问了

        root.left; // 继续访问15

        root.right;// 继续访问 7

}

再向上访问,看root为3的情况:

void visit(){

        list.add(root);// 3被访问了

        list.left;// 9被访问了

        list.right;// 20被访问了

}

通过上述举例,20是一个树的根节点,3又是另一个树的根节点 ,而且两者的访问方式相同,所以可以直接合并到一起:

void visit(){

        list.add(root);

        visit(root.left);

        visit(root.right);

}

这就是递推方法

分情况讨论,明确结束条件 

        上面有了递归的主体,但是这个递归什么时候结束呢? 很明显应该是root=null的时候。一般来说链表和二叉树问题的终止条件都包含当前访问的元素为null。

结合递推公式 + 终止条件,写出完整方法

结合递推公式和终止条件,可写出完整的树的前序遍历方法,同时修改方法名,具体效果如下:

public void preOrder(TreeNode root){
    if(root == null){
        return;
    }
    System.out.print(root.val +" ");
    preOrder(root.left);
    preOrder(root.right);
}

画图校验

image.png

 

中序遍历

前序遍历理解后,中序和后序就容易理解了。中序遍历代码如下:

    /**
     * 中序遍历
     * @param root 根节点
     */
    public void cenorder(TreeNode root){
        if (root == null){
            return;
        }
        cenorder(root.left);
        System.out.print(root.val+"  ");
        cenorder(root.right);
    }

后序遍历

 后序遍历代码如下

    /**
     * 后序遍历
     * @param root 根节点
     */
    public void postOrder(TreeNode root){
        if (root == null){
            return;
        }
        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.val + "  ");
    }

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/848572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【硬件设计】模拟电子基础三--集成运算放大电路

模拟电子基础三--集成运算放大电路 一、集成运算放大器1.1 定义、组成与性能1.2 电流源电路1.3 差动放大电路1.4 理想运算放大器 二、集成运算放大器的应用2.1 反向比例运算电路2.2 同向比例运算电路2.3 反向加法运算电路2.4 反向减法运算电路2.5 积分运算电路2.6 微分运算电路…

vivado tcl创建工程和Git管理

一、Tcl工程创建 二、Git版本管理 对于创建完成的工程需要Git备份时,不需要上传完整几百或上G的工程,使用tcl指令创建脚本,并只将Tcl脚本上传,克隆时,只需要克隆tcl脚本,使用vivado导入新建工程即可。 优…

最详细,手机APP测试-ADB命令总结大全,你要的都在这...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 adb是什么&#x…

系统集成项目成本管理

在项目中,成本是指项目活动或其组成部分的货币价值或价格,包括为实施、完成或创造该活动或其组成部分所需资源的货币价值。具体的成本一般包括直接工时、其他百接费用、间接工时、其他间接费用以及采购价格。 项目全过程所耗用的各种成本的总和为项目成本…

无数资深果粉称之为 Mac 装机必备软件的 ——CleanMyMac X

它就是被无数资深果粉称之为 Mac 装机必备软件的 ——CleanMyMac X。或许你没用过它,但是大概率你身边一定有它的资深用户,作为 MacPaw 旗下的老牌清理软件,在全球已经拥有超过 2500 万次的下载量。 它有着五大强悍的功能,可以帮…

超融合基础架构 (HCI) 监控

什么是超融合基础架构 (HCI) 超融合基础架构 (HCI) 是一种软件定义的基础架构技术,它将计算、虚拟化和网络功能全部整合到一个设备中。超融合基础架构 (HCI) 解决方案使用软件和 x86 服务器来取…

【Linux命令详解 | less命令】Linux系统中用于分页显示文件内容的命令

文章标题 简介一,参数列表二,使用介绍1. 分页显示文件内容2. 搜索关键词3. 显示行号4. 显示特定内容5. 只显示匹配行6. 忽略大小写搜索7. 输出到文件8. 动态查看文件增长9. 开启对二进制文件的支持10. 显示控制字符11. 忽略键盘输入12. 显示百分比进度条…

深度学习环境安装依赖时常见错误解决

1.pydantic 安装pydantic时报以下错误: ImportError: cannot import name Annotated from pydantic.typing (C:\Users\duole\anaconda3\envs\vrh\lib\site-packages\pydantic\typing.py) 这个是版本错误,删除装好的版本,重新指定版本安装就…

设计模式——设计模式以及六大原则概述

设计模式代表有经验的面向对象软件开发人员使用的最佳实践。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。 这些解决方案是由许多软件开发人员在相当长的时间内通过试错获得的。 什么是 GOF(四人帮,全拼 Gang of Four&#xff09…

微信QQ链接防红屏障源码页面

一、作用:使用跳转到浏览器方式,防止自己链接在微信和QQ等软件无法打开。 微信QQ链接防红屏障.zip - 蓝奏云文件大小:2.8 M|https://wwwf.lanzout.com/iwrWS14sfzcb 二、图片:​ 六、安装与使用:上传到空间即可 使用…

Dubbo是干嘛的,Dubbo原理和机制,Dubbo的核心组件

目录 一、介绍1、Dubbo是什么2、为什么需要Dubbo3、Dubbo的特性 二、 Dubbo的核心概念1、暴露和引用(Export and Refer)2、服务提供者和服务消费者3、注册中心4、负载均衡5、集群容错 三、Dubbo的架构1、服务提供者和服务消费者之间的通信流程2、Dubbo的…

NR CSI(六) CSI reporting using PUCCH

之前NR CSI(二) the workflow of CSI report有对CSI report的相关流程进行介绍,而这篇主要看下CSI reporting over PUCCH的相关规定。 CSI report在PUCCH上传输的场景如上表红色字体,有三种场景,具体的对应的是Periodic 和Semi-Persistent CS…

sentinel核心流程源码解析

sentinel的处理槽(ProcessorSlot) 可以说,sentinel实现的各种功能就是由各处理槽完成的 ,ProcessorSlot定义了四个方法: 当进入该处理槽时触发该方法 处理完 entry方法之后触发该方法 退出该处理槽时触发该方法 exit方法处理完成时触发该方法 sentinel的…

Gitlab CI/CD笔记-第二天-GitOps的流水线常用关键词(1)

一、常用关键词 在Gitlab项目的根目录需要创建一个 .gitlab-ci.yaml的文件。 这个文件就是定义的流水线。Call :"Pipeline as code" 二、这条流水线怎么写? 一、掌握常用的关键词即可。 1.关键词分类 1.全局关键词 Global Keywards 2.任务关键词…

如何将jar包部署到宝塔

尝试多种方式上传,但启动一直失败,这种方式亲测是好使的 项目内修改位置 在pom.xml文件中将mysql的scope改成provided,如果是固定的版本号会出现问题 之后就可以打包啦,直接点击maven中的package 找到打包文件的位置&#xff…

人工智能贷款公司upstart:从挫折到复出,从喧嚣中崛起

来源:猛兽财经 作者:猛兽财经 总结: (1)对Upstart(UPST)所在次级抵押贷款市场来说,最糟糕的时期可能已经过去了,因为情况正在出现好转。 (2)Upst…

如何选择适合您需求的新闻稿件校对软件

选择适合您需求的新闻稿件校对软件时,可以考虑以下几个因素: 1.校对功能:了解软件的校对功能,包括拼写检查、语法检查、词汇和语义检查等方面。确保软件能够满足您的基本校对需求,并提供准确的建议和改进意见。 2.多语…

Windows11环境下VS2019调用Pytorch语义分割模型(C++版)

语义分割模型在训练时往往采用python脚本进行网络搭建和训练,并获得训练好的模型。为了提高效率方便整个工程项目部署,实际工程应用中通常希望使用C编程语言调用训练好的网络模型。查询大量网络资料并踩过无数坑后,经实际测试实现了在window1…

Java课题笔记~ 使用 Spring 的事务注解管理事务(掌握)

通过Transactional 注解方式,可将事务织入到相应 public 方法中,实现事务管理。 Transactional 的所有可选属性如下所示: propagation:用于设置事务传播属性。该属性类型为 Propagation 枚举, 默认值为 Propagation.R…

【TCP/IP】【测试】如何使用vlc发送组播协议包或组播数据流

🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:TCP/IP协议&…