当前位置: 首页 > article >正文

java数据结构_二叉树_5.4

2.6 二叉树的遍历代码实现

以下图为例,研究二叉树的前 中 后 序的遍历方式

要重点理解二叉树的递归过程,不断的将大树分解为小树,根结点在不同的变化,如下图,以A为根结点的时候,红色框中的是其左子树和右子树,在A的左子树中,又可以以B为根,来分解出一棵新的树(绿色框中),其中,以B为根结点,D为左子树,E为其右子树...以这个思路,可以将一棵大的二叉树逐渐分解为小的二叉树。

由大到小,就是递归中递的过程,由小到大,就是递归中归的过程。

接下来实现用递归的方法来实现前 中 后序的遍历

前序遍历

在使用递归的时候,一定要想清楚结束递归的条件,以及在方法中,不断接近这个结束递归的条件。

下面是前序递归的实现代码。第一行代码,就是递归中的结束条件,一只将一棵大树拆到其根结点为null,就return。

因为前序递归是 先根 再左 后右,所以代码的顺序是先打印,再向root.left即当前根结点的左子树递归,再向当前根结点的右子树root.right递归。

注意:要清楚明白,在递归过程中,不断将大树分解为小树,根结点不断变化

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

}

下面是递归过程图:

1.

2.

3.

4.

5.

再按照上述的操作,进行不断的递操作,不断的归操作,其中大树不断变为小树,根结点不断进行变化,一点一点按顺序将二叉树按照根左右的顺序遍历打印完成!

在测试类中,测试符合预期!

 还可以用栈来解释递归的情况,之前的学习,一直在提,递归是不断的创建和销毁函数栈帧的过程,下图为示意图:

1.不断将大树递为小树,下图递归到了以D为根结点的小树

2.D的左右子树都为null,则D出栈,回归到B 

3.再将B的右子树进行递和归操作 

4.再按照上面的操作,将右子树递归(出栈入栈)完成

上面介绍了前序遍历的递归模拟实现,可以对简单的几行代码有更加深入的了解

中序遍历

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

可以自行像先序遍历一样画图理解

后序遍历

public void postOrder(TreeNode root) {
    if(root == null) return;

    postOrder(root.left);
    postOrder(root.right);
    System.out.print(root.val + " ");
}

实现将遍历结果存放在list中

前序遍历

上面的前 中 后 序遍历都是直接将元素进行打印,能不能将其遍历的结果存放在一个list中呢?

首先可以想到下图的代码:

创建一个成员变量ret,然后将之前的打印代码转换为add,可以正常实现效果

但是,可以考虑一下,因为这样的方法是存在返回值的,每次递归过程中的返回值没有利用到。

可以使用下面的方法,每递归一次都创建一个ret,然后分别把左子树和右子树的元素放在一个List中,然后再把左右子树的List添加在一起。

中序遍历

后序遍历

上面三个递归,如果不理解的话,可以仿照最开始的前序遍历图,捣鼓模拟一下,也就明白了递归的巧妙之处!!!

下面是力扣刷题的链接,百分之九十就是将遍历结果存放在list中,有一点不一样的是返回值,可以自己做一下!

前序:144. 二叉树的前序遍历 - 力扣(LeetCode)

中序:94. 二叉树的中序遍历 - 力扣(LeetCode)

后序:145. 二叉树的后序遍历 - 力扣(LeetCode)

完!


http://www.kler.cn/a/540165.html

相关文章:

  • C语言-结构体
  • 【AI学习】LLM的发展方向
  • UnityShader学习笔记——高级纹理
  • VSCode 下载与使用教程:附百度网盘地址
  • 【后端开发】系统设计101——Devops,Git与CICD,云服务与云原生,Linux,安全性,案例研究(30张图详解)
  • 前沿科技一览未来发展趋势
  • 小白系列:数据库基础知识解析
  • 等待时间问题(C++)
  • 蓝桥杯填空题汇总
  • 【从零开始的LeetCode-算法】63. 不同路径 II
  • bladeX微服务框架如何修改nacos分组
  • 避开Arrays.asList使用的坑
  • SAP ABAP调用DeepSeek API大模型接口
  • git实现回退
  • 让office集成deepseek,支持office和WPS办公软件!(体验感受)
  • 进阶数据结构——单调栈
  • 【JVM详解三】垃圾回收机制
  • 嵌入式硬件篇---OpenMV的硬件流和软件流
  • 使用Chisel建立端口转发与SOCKS5代理隧道
  • [含文档+PPT+源码等]精品大数据项目-Django基于大数据实现的心血管疾病分析系统
  • 使用OpenGL自己定义一个button,响应鼠标消息:掠过、点击、拖动
  • 深度学习-利用预训练的 ResNet 和 DenseNet 模型进行医学影像诊断
  • HiveQL命令(二)- 数据表操作
  • 自动驾驶数据集三剑客:nuScenes、nuImages 与 nuPlan 的技术矩阵与生态协同
  • [LVGL] 在VC_MFC中移植LVGL
  • linux基础命令1