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

二叉树三大遍历-精髓(Java)

写在前面

leetcode:94. 二叉树的中序遍历

递归:很简单,只需调换顺序。但不能死记硬背,递归的精髓在于只需要处理好边界条件,其他交给数学归纳法即可,不要一开始就深入递归,在脑袋想它每一步的步骤,这是错误的方法。

非递归:必会,因为面试考核不会只考你递归写法,非递归的话按照我的思路,前序和后序是一个解法,中序是一个解法,都很容易理解。

什么是前序、中序、后序

前中后体现在根的遍历时机。

前序:根 左子树 右子树

中序:左子树 根 右子树

后序:左子树 右子树 根

二叉树的结构

 public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}

递归

递归思路

  1. 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
  2. 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
  3. 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

前序+中序+后序

只需要调整`list.add(root.val);`代码的顺序即可,比如以下代码分别为前序和中序。

非递归

前序 + 后序

前序

先序:先压栈push头节点;然后下面步骤。

1)pop一个节点cur;

2)处理cur;

3)先push右节点,再push左节点(如果有的话);

4)循环上3个步骤;

解释:
(1)为什么先入栈右节点,因为栈是先进后出,为了实现先遍历左节点的效果,需要左节点晚一些入栈。
(2)为什么不需要压栈根节点,因为所有的子树都会被用左右节点分解,这里根节点的概念也就是左右节点的概念了。

 

    后序

    改一下先序的代码即可,先序压栈是先右后左,颠倒一下,得到的遍历顺序就是 中右左,再result数组反转一下,就变成想要的 左右中。

    中序

    中序:不断把左边界压栈,没有了就穿到右边继续左边界。【因为所有的树都可以被左边界分解掉】左根右,右会被不断分解为左根右。

    1)每棵子树整棵树左边界进栈,

    2)依次弹出的过程中,打印,对弹出节点的右子树周而复始。

    解释:
    (1)为什么这里需要多加一个指针,因为先序、后序{ 处理 } 和{ 遍历 }的节点顺序是一致的,中序没办法,他是遍历到左下角才处理,无法灵敏控制达到这种效果,必须借助栈来暂存元素。

    (2)指针动向:

    • 指针非空就压栈并往左,指针为空就出栈输出并往右【不管遍历到左节点还是右节点的指针为空,都是直接出栈输出】
    • 弹出之后只需要指向他的右孩子即可。【左 根 右】

    http://www.xdnf.cn/news/390475.html

    相关文章:

  1. 代码随想录训练营第二十一天 |589.N叉数的前序遍历 590.N叉树的后序遍历
  2. 【大模型】MS-SWIFT : 高效、灵活的大模型微调框架
  3. 【Java EE初阶 --- 多线程(初阶)】线程安全问题
  4. 【Android】cmd命令
  5. 大学之大:苏黎世大学2025.5.11
  6. 数字化工厂中央控制室驾驶舱系统 API接口文档
  7. go 通过汇编学习atomic原子操作原理
  8. iVX 图形化编程平台:结合 AI 原生开发的革新与实践
  9. 07.three官方示例+编辑器+AI快速学习webgl_buffergeometry_attributes_integer
  10. Python-UV多环境管理
  11. 5G-A来了!5G信号多个A带来哪些改变?
  12. 经典音乐播放器——完美歌词 Poweramp Music Player 3 build
  13. MyBatis进阶:掌握动态SQL,实现灵活的数据库查询
  14. 实战项目5(08)
  15. 【网络安全】——大端序(Big-Endian)​​和​​小端序(Little-Endian)
  16. 【Linux系列】bash_profile 与 zshrc 的编辑与加载
  17. 大语言模型通过MCP控制STM32-支持Ollama、DeepSeek、openai等
  18. 大模型在肾肿瘤诊疗全流程预测及方案制定中的应用研究
  19. 【英语笔记(三)】介绍谓语动词的分类,初步讲解四种基本状态:一般、进行、完成、完成进行
  20. C#游戏开发中的注意事项
  21. 淘宝19块钱激光雷达SDK转ROS2架构
  22. 低代码开发:开启软件开发的新篇章
  23. RAID磁盘阵列的概念(自用留档)
  24. Redis BigKey 问题是什么
  25. 卷积神经网络-从零开始构建一个卷积神经网络
  26. PDF2zh插件在zotero中安装并使用
  27. FramePack AI图片生成视频 v1.1 整合包
  28. c++STL-string的使用
  29. Java面试常见技术问题解析
  30. 软考冲刺——案例分析题Super VLAN