二叉树的三种基础遍历方式— java实现

Java实现二叉树的三种遍历方式 private void preErgodic(Node x,Queue keys):使用前序遍历,把指定树x中的所有键放入到keys队列中。private void afterErgodic(Node x,Queue keys):使用中序遍历,把指定树x中的所有键放入到keys队列中。private void midErgodic(Node x,Queue keys):使用中序遍历,把指定树x中的所有键放入到keys队列中。//使用中序遍历获取指定树x的所有键,并放到Keys队列中。... 阅读详情

二叉树的三种基础遍历方式有 前序遍历、中序遍历、后序遍历。

节点结构:

在这里插入图片描述


测试二叉树的结构:

在这里插入图片描述

前序遍历

前序遍历的遍历优先度:根节点> 左儿子节点 > 右儿子节点

在这里插入图片描述
当root 为空节点时 则直接结束函数,是递归的结束条件

由于根节点的遍历优先度最高,接下来直接用根节点,这里执行最简单的 打印操作 代表遍历树时使用的操作

在这里插入图片描述

接着分别递归左子树和右子树即可
在这里插入图片描述

注意一定先左子树然后再 右子树。

示例:

在这里插入图片描述

在这里插入图片描述

前序遍历非递归

前序遍历非递归有很多方式,这些方式的共同特点是都需要用到栈,因为用递归实现前序遍历时会用到系统提供的栈。

方法1:

public void preOrderNor1(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                System.out.print(cur.val + " ");
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            cur = top.right;
        }
    }

方法1我把它叫做 不停找左法,大概思路 是 cur 不断的找左子节点放到栈里面 直到左子树为 null,
然后每次弹出栈顶元素,代表栈顶元素的左子树节点和根节点已经 遍历完了,弹出之后 cur = 弹出元素 的右儿子。


该语句在含有递归时是递归的结束条件,在非递归里是 一个特判,这句话其实也可以不写(会跳过while循环),但是由于需要费脑子去判断可以写不写,一般写上绝对没有错。

在这里插入图片描述


在这里插入图片描述

只有当 cur == null 并且 栈为空的时候循环才会停止,栈不为空很好理解,只有当 cur 也为空的时候才结束循环的 原因有两点

刚开始栈没有插入值,所以循环进不去,另一点是因为当把整棵树的根节点从栈弹出的时候,此时如果右子树存在的话,但是栈已经为空了,所以会跳出循环。

方法2:

public void preOrderNor2(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode top = stack.pop();
            System.out.print(top.val + " ");
            if (top.right != null) {
                stack.push(top.right);
            }
            if (top.left != null) {
                stack.push(top.left);
            }
        }
    }

个人觉得方法二比方法一要好理解点,也好记忆。

方法二的思路是 先将整棵树的根节点放到栈里面,每次从栈弹出一个节点并且使用该节点,然后将该节点的右节点、左节点先后放到栈里面

右儿子比左儿子先入栈,那么左儿子节点一定就比右儿子先出栈,也就会先使用该节点。

中序遍历

中序遍历优先度:左儿子节点 > 根节点 > 右儿子节点
在这里插入图片描述
中序遍历递归只需要将 顺序变一下即可。
在这里插入图片描述

中序遍历非递归

中序遍历非递归的写法和 前序遍历非递归方法1的写法非常像,只需要改一处

在这里插入图片描述
那就是把打印操作放到弹出栈顶元素这里。

在每次弹出元素前,cur 一定等于null,栈顶元素一定没有左儿子节点,此时再打印,就保证了左儿子节点一定比根节点要先打印。

后序遍历

后序遍历优先度:左节点 > 右节点 > 根节点

在这里插入图片描述

在这里插入图片描述

后序遍历非递归

方法1:

public void postOrderNor1(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        TreeNode prev = null;
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode peek = stack.peek();
            if (peek.right == null || peek.right == prev) {
                System.out.print(stack.pop().val + " ");
                prev = peek;
            } else {
                cur = peek.right;
            }
        }
    }

相比于前序和中序遍历,需要多用到一个变量prev,prev记录的是上一次被遍历过的节点
 

这个prev初始值可以是null,也可以是root,方法3当中的prev是不能为null

 

在这里插入图片描述
这里是 查看栈顶元素 而不是 弹出栈顶元素 的原因是

 
弹出栈顶元素代表着以该点为根节点的整棵树已经遍历完了
 

然而虽然栈顶元素的左子树一定为空,但是由于是后序遍历,右儿子节点的优先度比根节点要高,所以需要先遍历右子树之后,才可以弹出栈顶元素

在这里插入图片描述

peek.right == null 代表没有右子树,peek.right == prev 代表右子树已经遍历过了

 
只要满足这两种情况,就说明左子树和右子树已经搞定了,此时就可以弹出栈顶元素了,并且记录该节
点作为下次的prev
 

如果不满足if 里的条件,则证明 右子树没有被遍历,此时就需要让 cur 迈一步先去遍历右子树。


方法2:

public void postOrderNor2(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> stack1 = new Stack<>();
        Stack<TreeNode> stack2 = new Stack<>();
        stack1.push(root);
        while (!stack1.isEmpty()) {
            TreeNode top = stack1.pop();
            stack2.push(top);
            if (top.left != null) {
                stack1.push(top.left);
            }
            if (top.right != null) {
                stack1.push(top.right);
            }
        }

        while (!stack2.isEmpty()){
            System.out.print(stack2.pop().val + " ");
        }

    }

将前序遍历中的方法2 当中的两个 if 互换 即可将遍历优先度改为(根 > 右 > 左)
在这里插入图片描述
将 (根 > 右 > 左) 倒过来则就是 后序遍历,所以此时我们可以再创建一个 栈。

在这里插入图片描述
将每次弹出的栈顶元素放到另一个栈中,由于栈是先进后出,所以最后将所有元素挨个出栈,那么遍历的顺序就是(左 右 根)


方法3:

public void postOrderNor3(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode prev = root;
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode peek = stack.peek();
            if (peek.left != null && peek.left != prev && peek.right != prev) {
                stack.push(peek.left);
            } else if (peek.right != null && peek.right != prev) {
                stack.push(peek.right);
            } else {
                System.out.print(stack.pop().val + " ");
                prev = peek;
            }
        }
    }

方法3和方法1的思路很像,prev的含义也是相同的,都代表的是上一次遍历过的节点

由于左儿子节点的优先度最高,所以方法1每一次都“无脑”先往左“走到黑”

方法3的思路是 “一步一步走”

在这里插入图片描述
 

注意这里的prev初始值不能是null,比如当peek等于下图当中的节点时,因为没有节点左右子树都遍历完的,以prev还是初始值null

因为此时peek的右儿子是null,恰好等于prev,程序会以为peek的右子树已经遍历完了,所以不会将peek的左节点入栈。


每一次查看栈顶元素后,需要判断三种情况,如果左子树节点没有被遍历,那么就将左子树节点入栈

因为左节点的优先度大于右节点,所以第二个判断右节点。

当左右节点都被搞定时,此时才到根节点,所以弹出打印即可,并且一定记得记录prev.

在这里插入图片描述

值得注意的是,这里的判断条件很容易出错,peek.left != null 和 peek.left != prev 很好理解

peek.right != prev 可千万不能落下,因为栈顶元素的右子树遍历过,那么一定意味着 左子树一定也被遍历过了。

如果没有这个判断条件,那么就会无限循环,在遍历完右子树完 会再次将左子树的节点入栈。

在这里插入图片描述

假如 G是上一个遍历完的,那么此时F一定会被提前遍历过(因为if 的顺序),如果没有那个判断条件,那么F 又会被再次 入栈从而无限循环。

当然这棵树会在左边那颗 B 的树时就会陷入死循环,会无限的打印 D H E
在这里插入图片描述


完

数据结构-树型实现二叉树的遍历(Java) 首先判断根节点是否为空,然后初始化队列queue,并将根节点root加入到队列中去,当队列不为空时,队列中弹出节点node,加入到结果中去,如果左子树非空,左子树加入到队列中去,如果右子树非空,右子树加入到队列中去。后序遍历(Postorder Traversal)的访问顺序:后序遍历左子树à后序遍历右子树à根节点。前序遍历(Preorder Traversal)的访问顺序:根节点à前序遍历左子树à前序遍历右子树。先序遍历的代码实现首先先判断根节点是否为空,为空就遍历就结束了;本题要求实现给定二叉树的。 阅读详情

相关推荐

二叉树及完全二叉树的前序遍历、中序遍历、后序遍历及层序遍历

本期主要分享的是树形结构的基本概念,树型结构中完全二叉树的创建以及二叉树的一些基本操作,其中主要包括了二叉树的创建,销毁以及二叉树的前序遍历中序遍历及后序遍历,主要用到的思想的函数递归思想,希望小伙伴们一定要注意基础知识的重要性,不能急于求成;加油小伙伴们!

weixin_58016534的博客 5912

JAVA实现------二叉树的遍历,三种常见的遍历方式

三种常见的二叉树遍历方式

IKonwNothing的博客 1546

算法:二叉树的先序遍历、中序遍历、后序遍历(递归及非递归方式)的java代码实现

首先来看一棵二叉树: 1、前序遍历: 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。 若二叉树为空则结束返回,否则: (1)访问根结点; (2)前序遍历左子树; (3)前序遍历右子树 ; 需要注意的是:遍历左右子树时仍然采用前序遍历方法。可以看出前序遍

宋伟的专栏 1万+

数据结构—二叉树的4种遍历方式详解以及Java代码的完整演示

本文介绍了4种二叉树的遍历方法,分别是前序、中序、后续、层序遍历,并且每种方法均提供了详尽的Java语言的代码演示,在最后还介绍了遍历结果推导的方法。

终生学习践行者 1万+

EGO-Planner文章解读(一)——论文原理和算法实现

详细解读egoplanner论文和代码

fegxg的博客 3987

麒麟系统下PaddleOCR的离线部署实战:从环境搭建到模型优化

本文详细介绍了在国产麒麟操作系统上离线部署百度PaddleOCR的完整实战流程。从系统环境准备、Conda虚拟环境搭建,到PaddlePaddle框架和PaddleOCR的离线安装,再到预训练模型的本地部署与优化技巧,提供了全面的文字识别解决方案。重点解决了离线环境下依赖包管理、模型量化加速等核心问题,并附带了批量处理与内存监控的进阶代码,适用于对数据安全有严格要求的政务、金融等场景。

docker7nomad的博客 963

算法分享系列No.3----实现二叉树的先序,中序和后序遍历

算法分享系列No.3----实现二叉树的先序,中序和后序遍历 本题考点:【树】【哈希】【栈】 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有节点,使每一个节点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。 二叉树的遍历主要有三种,括号内为其特点: (1)先(根)序遍历(根左右) (2)中(根)序遍历(左根右) (3)后(根)序遍历(左右根)

尕白白的专栏 989

STM32CubeMX、keil、simulink联合开发MCU教程

一、整体思路 利用Matlab的simulink搭建模型生成C代码,通过stm32cubemx生成工程,最后在KEIL或者IAR等工具里面编译生成代码下载至MCU中执行。 本文以流水灯建立模型和简单使用定时器为例进行演示。 二、开发环境 1、安装Matlab Matlab版本建议在2013B以上,本文使用Matlab 2016a。 2、安装STM32硬件支持包 下载地址(https://www.stmcu.org.cn/document/detail/index/id-216053) 安装完成后重启MAT

tzlaa的博客 7735

代码随想录算法训练营第十四天(二叉树I)| 144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历(JAVA)

递归的方法论还是挺重要的,感觉思路一下子就清晰了不少。迭代看着有点懵,后面一定要弄明白,加油!

m0_61634066的博客 683

iOS自动化之打包-xcodebuild命令行打包.app并安装到ios模拟器

xcode xcodebuild xcrun ios模拟器 iOS UI自动化测试 ios自动打包安装到ios模拟器

z12347891的博客 5074

ardupilot开发 --- Remote ID 篇

适配ardupilot的Remote ID模块研发,远程标识模块研发。Remote ID模块可以通过蓝牙或wifi向外广播无人机的状态信息、位置信息、任务信息等,并可以通过蜂窝数据向国家无人驾驶航空器一体化综合监管服务平台上报这些信息。Remote ID功能是21年起国家出台的民用无人机适航飞行的基本要求!

记录老板的每次pua,分享领导每天的毒鸡汤... 9607

Leetcode 二叉树遍历 Mysql DML&DQL

二叉树遍历 当前掌握了二叉树三种遍历方法: 1.递归遍历 2.非递归遍历(迭代遍历) 3.统一迭代法 遍历分为三种方式: 1.前序遍历:中→左→右 2.中序遍历:左→中→右 3.后序遍历:左→右→中 First,递归遍历 递归算法的三个要素(以本题为例): 1.确定递归函数的参数和返回值。 遍历节点的数值不需要返回值 所以定义为void void order(TreeNode root,List<Integer> result) 2.确定终止条件。 当遍历到的节点为

JIE25的博客 1191

【完整梳理验证】企业微信第三方应用接入全流程java版

由企业内部的开发者自己开发部署,相当于是企业自己的资产,调用接口基本没有任何限制。由SaaS服务商的开发者开发并部署在服务商侧,面向所有企业。需要企业授权使用(先试用后付费),服务商仅可获取企业授权部分的权限,相当于白名单控制。由服务商的开发者开发,但部署在企业内部。一般是线下签约采购方式,因此权限几乎与自建应用无异,企业管理员只需要配置不对服务商开放的敏感权限,相当于黑名单控制。服务商后台地址:企业微信服务商官网企业管理后台地址:企业微信管理后台服务商,可以理解为 SAAS 中的运营端。企业管理端,可以理

Hello, New World! 2760

二叉树前序中序后序遍历java代码简单记录

前序遍历 import java.util.*; class Solution { public List<Integer> list = new ArrayList<>(); public void preorder(TreeNode root){ if(root==null) return ; list.add(root.val); preorderTraversal(root.left); .

haiwanglail的博客 106

别再让 AI 瞎写 SAP 代码了!这套 Claude Code Skill 的验证机制才是关键

本文深入解析了专为SAP CAP开发设计的AI辅助工具sap-cap-capire的技术架构。该工具采用四层设计:协议层集成MCP和LSP实现实时模型访问与语法检查;智能层通过4个专业化Agent(数据建模、服务开发等)分工协作;验证层确保代码质量;知识层存储文档模板。这种工程化设计解决了通用AI在CAP开发中面临的上下文不足、专业性缺失和代码质量保证等核心问题,通过本地化服务和实时反馈机制显著提升了开发效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 882

ZW3D 二次开发-制作插件

1.Windows 7 SP1 或 Windows 10 或 Windows 11(推荐 Windows 11)2.Visual studio 2017-2022 (或 C/C++的任何其他集成开发环境)(推荐 Visual studio 2022)3.ZW3D 2023 或以上版本(建议使用与 ZW3D 一致的 API 的版本)4.Qt5.9.7(for Windows)博主学习使用环境的是:Windows 11 Version 24H2 + Visual studio 2022 + Qt5.9.7(fo

fhqiwmc的博客 810

数据结构|二叉树的三种遍历方式,你掌握了几种?

本期讲解二叉树的三种遍历方式:前序遍历、中序遍历、后序遍历的详细讲解,图文并茂通俗易懂。

我的主页 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java实现二叉树的创建及三种遍历方式

java实现二叉树的创建及三种遍历方式 接口定义 public interface Tree { /** * 二叉树的创建 * @param arr * @return */ public List&lt;Node&gt; createBinTree(int[] arr); /** * 前序遍历 * @para...

hanliuxi4265的博客 1567

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

二叉树各种遍历算法 Java 实现总结

PS: 作者是正在学习Java的小白,在这里会总结一些与Java相关知识(Java代码实现),如有不足,欢迎前来讨论指正,十分感谢 !!! 目录二叉树各种遍历算法 Java 实现总结0 二叉树简述0.0 概述0.1 分类0.2 数据结构1 二叉树的遍历1.1 前序遍历1.2 中序遍历1.3 后序遍历1.4 层序遍历1.5 小总结 二叉树各种遍历算法 Java 实现总结 0 二叉树简述 0.0 概述 二叉树是树的特殊一种,具有如下特点: 1、每个结点最多有两颗子树,结点的度最大为2。 2、左子树和右子树是有顺

qq_41866626的博客 8183

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

二叉树的三种遍历方式java实现

二叉树的定义 二叉树(binary tree)是结点的有限集合,这个集合或者空,或者由一个根及两个互不相交的称为这个根的左子树或右子树构成. 从定义可以看出,二叉树包括:1.空树 2.只有一个根节点 3.只有左子树 4.只有右子树 5.左右子树都存在 有且仅有这5中表现形式 二叉树与...

李云龙的意大利面 479

二叉树的三种遍历及代码实现

二叉树是一种特殊的数据结构,二叉树是有两个节点的树,二叉树的基本表示是左右孩子表示法,基本操作是遍历,二叉树有三种遍历方法: 1.先序/前序遍历: 根左右 2.中序遍历: 左根右; 后序遍历法: 左右根 就比如这颗二叉树: 先序:A B D E G H C F 中序:D B G H E A C F 后序:D H G E B F C A 下面来用Java实现这三种遍历方式: 先序遍历: 总的先序遍...

qq_44956118的博客 1970

二叉树的常见方法及三种遍历方式 Java 实现

读完本文你将了解到: 什么是二叉树 Binary Tree两种特殊的二叉树 满二叉树完全二叉树满二叉树 和 完全二叉树 的对比图 二叉树的实现 用 递归节点实现法左右链表示法 表示一个二

zhendong_Z 1265

二叉树的遍历方式详解及代码示例

二叉树是数据结构中的一种基本形式,它广泛应用于各种算法中。二叉树的遍历是学习树结构时不可避免的一部分。今天这篇博客将详细讲解二叉树的三种主要遍历方式:前序遍历、中序遍历和后序遍历,并通过代码示例帮助大家理解它们的实现方式。👨‍💻不管你是刚开始学习数据结构的小白,还是希望复习知识点的同学,这篇文章都会为你提供清晰易懂的讲解。🚀访问根节点遍历左子树遍历右子树在前序遍历中,我们首先访问当前节点,然后递归地遍历左子树和右子树。这意味着根节点在左子树和右子树之前被访问。遍历左子树访问根节点。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 1万+

关于二叉树的前序、中序、后序三种遍历

二叉树遍历分为三种:前序、中序、后序,其中序遍历最为重要。为啥叫这个名字?是根据根节点的顺序命名的。比如上图正常的一个满节点,A:根节点、B:左节点、C:右节点,前序顺序是ABC(根节点排最先,然后同级先左后右);中序顺序是BAC(先左后根最后右);后序顺序是BCA(先左后右最后根)。    比如上图二叉树遍历结果    前序遍历:ABCDEFGHK    中序遍历:BDCAEHGKF    后序...

迷途中的一片羽毛博客 47万+
上一篇: MySQl 中对数据表的增删改查(基础)
下一篇: MySQL中的数据库约束
shallrelow
博客等级 码龄3年 753粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值