Java二叉树实战:从基础遍历到高级应用

Java实战:遍历二叉树 本实战项目以二叉树遍历为核心,通过实例演示和编程实操相结合的方式,深入探讨了前序、中序和后序遍历的原理与应用。首先,手工展示了满二叉树在不同遍历顺序下的节点访问序列;随后,在Java环境下构建了`TreeNode`类作为二叉树节点,并设计了`TreeNodeUtils`工具类,实现三种遍历方法。 阅读详情

1. 从零开始:为什么二叉树是程序员的必修课?

如果你刚开始学编程,可能会觉得“二叉树”这个词听起来有点吓人,像是那种只有高手才懂的神秘玩意儿。其实不然,我第一次接触二叉树时,也觉得它离实际开发很远,直到后来在项目中用它解决了一个文件目录遍历的问题,我才恍然大悟:这玩意儿太实用了!二叉树就像我们生活中的家谱图或者公司的组织架构图,是一种非常直观的、用来表示“一对多”层次关系的数据结构。在Java的世界里,掌握二叉树,尤其是它的遍历和各种操作,是你从“会写代码”到“懂数据结构”的关键一步。

简单来说,二叉树是树形结构的一种,它的每个节点最多有两个“孩子”,我们习惯叫它们左孩子和右孩子。这种限制让它变得规整,也催生出了很多高效的算法。你电脑里的文件系统、游戏中的决策树、甚至编译器的语法分析,背后都有二叉树的身影。我见过不少新手朋友,一上来就啃复杂的算法,结果越学越迷糊。我的建议是,先把二叉树这个基础打牢,它的思想会像一把钥匙,帮你打开算法和数据结构的大门。接下来,我会带你从最基础的遍历开始,一步步深入到实际应用,保证你学完就能用上。

2. 核心基石:彻底搞懂二叉树的四种遍历

遍历,就是按照某种规则,把树里的每个节点都“访问”一遍。这是所有二叉树操作的基础,就像你要打扫房间,总得有个顺序,是从客厅到卧室,还是从卧室到客厅。二叉树的遍历主要有四种经典方式:前序、中序、后序和层序。很多面试题都爱考这个,不是没有道理的,因为它能很好地考察你对递归和栈的理解。

2.1 递归三剑客:前序、中序与后序

这三种遍历方式的名字,其实就说明了“根”节点在什么时候被访问。它们都是深度优先的,意思就是会一条路走到黑,先深入到叶子节点,再回头。

前序遍历的规则是:根 -> 左 -> 右。想象一下你正在拆一个礼物盒(根),你肯定会先打开盒子看看里面是什么,然后再去拆里面的小盒子(左),最后拆另一个小盒子(右)。代码写起来非常直观:

void preOrder(TreeNode root) {
    if (root == null) return; // 遇到空房子(空节点),直接返回
    System.out.print(root.val + " "); // 1. 先访问根节点(拆大盒子)
    preOrder(root.left); // 2. 递归遍历左子树(拆左边的盒子)
    preOrder(root.right); // 3. 递归遍历右子树(拆右边的盒子)
}

我常用它来复制一棵树的结构,或者生成树的前缀表达式。

中序遍历的规则是:左 -> 根 -> 右。这就像你遍历一个二叉搜索树(BST)时,会自然得到一个升序序列。过程好比:你想了解一个部门,先找最基层的员工(左)聊,再找经理(根),最后找另一个团队的员工(右)。

void inOrder(TreeNode root) {
    if (root == null) return;
    inOrder(root.left); // 1. 先彻底遍历左子树
    System.out.print(root.val + " "); // 2. 再访问根节点
    inOrder(root.right); // 3. 最后遍历右子树
}

后序遍历的规则是:左 -> 右 -> 根。这个顺序在“释放”资源时特别有用。比如,你要删除一棵树,必须先删除左右子树的所有节点,最后才能安全地删除根节点。就像拆一个复杂模型,你得先把所有零件(左、右子树)都卸下来,最后才能拆主体框架(根)。

void postOrder(TreeNode root) {
    if (root == null) return;
    postOrder(root.left); // 1. 遍历左子树
    postOrder(root.right); // 2. 遍历右子树
    System.out.print(root.val + " "); // 3. 最后访问根节点
}

我刚开始总记混,后来用一个简单的例子就记住了:对于任何一个有三个节点的小树(根、左孩子、右孩子),把访问顺序读出来,就是遍历的名字。“根左右”就是前序,“左根右”就是中序,“左右根”就是后序。

2.2 层序遍历:使用队列的广度优先策略

层序遍历就和它的名字一样,是一层一层、从左到右地访问节点。它属于广度优先搜索(BFS)。这种遍历方式在生活中更常见,比如公司开会,从CEO到总监,再到经理,最后到员工,一层层传达。

实现它的核心数据结构是队列。思路很简单:先把根节点入队,然后循环执行“出队一个节点、访问它、并把它的左右孩子(如果存在)入队”这个过程。

void levelOrder(TreeNode root) {
    if (root == null) return;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root); // 老板(根节点)先入场
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll(); // 当前轮到的节点出队
        System.out.print(node.val + " ");
        // 让它的左膀右臂(左右孩子)排队等着
        if (node.left != null) queue.offer(node.left);
        if (node.right != null) queue.offer(node.right);
    }
}

层序遍历在判断完全二叉树、求树的最小深度等问题上非常有用。我当年面试时,就被要求手写一个层序遍历,并顺带统计每一层的节点数,所以这个一定要练熟。

3. 从理论到实战:二叉树基本操作全解析

光会遍历还不够,我们得能用二叉树解决实际问题。下面这些操作,都是面试和实战中的常客。我会用两种思路来讲:一种是“遍历思路”(带着一个全局变量或容器走遍天下),另一种是“子问题思路”(利用递归分解问题),后者往往更优雅。

3.1 统计节点数与叶子节点

求结点总数:遍历思路是设置一个全局变量size,每访问一个非空节点就加1。但更漂亮的是子问题思路:一棵树的节点数 = 左子树的节点数 + 右子树的节点数 + 1(根节点自己)。

// 子问题思路
int getSize(TreeNode root) {
    if (root == null) return 0; // 空树,节点数为0
    return getSize(root.left) + getSize(root.right) + 1;
}

求叶子结点个数:叶子就是没有孩子的节点。遍历思路是遇到叶子就让计数器加1。子问题思路则是:整棵树的叶子数 = 左子树的叶子数 + 右子树的叶子数。注意递归的终止条件:如果当前节点本身就是叶子,应该返回1。

// 子问题思路
int getLeafSize(TreeNode root) {
    if (root == null) return 0;
    if (root.left == null && root.right == null) {
        return 1; // 找到了一个叶子节点
    }
    return getLeafSize(root.left) + getLeafSize(root.right);
}

3.2 求树的高度与查找节点

获取二叉树的高度(深度):这是一个经典的递归定义。树的高度 = max(左子树高度, 右子树高度) + 1。空树的高度为0。

int getHeight(TreeNode root) {
    if (root == null) return 0;
    int leftHeight = getHeight(root.left);
    int rightHeight = getHeight(root.right);
    return Math.max(leftHeight, rightHeight) + 1;
}

这里有个小坑要注意:有些人会写成在递归调用里加1,容易造成逻辑混乱。记住,高度是在当前层,根据左右子树的结果计算出来的。

查找值为val的节点:思路类似前序遍历,先看根节点是不是,不是就去左子树找,左子树找不到再去右子树找。一旦找到,就立刻返回,这叫“剪枝”,可以避免不必要的搜索。

TreeNode find(TreeNode root, int val) {
    if (root == null) return null;
    if (root.val == val) return root; // 根节点就是,太幸运了
    TreeNode result = find(root.left, val); // 去左子树找
    if (result != null) return result; // 左子树找到了,直接返回,不去右子树了
    return find(root.right, val); // 左子树没找到,才去右子树找
}

3.3 判断完全二叉树

完全二叉树是个非常重要的概念,它是一种效率极高的数据结构,堆就是基于它实现的。定义简单说就是:除了最后一层,其他层都是满的,并且最后一层的节点都尽可能靠左排列。

如何判断?层序遍历再次派上用场。我们利用层序遍历,但这次把空节点也入队。当我们在队列中第一次遇到null时,就跳出循环。然后检查队列中剩余的元素:如果剩余元素全是null,则是完全二叉树;如果剩余元素中出现非null节点,则不是。

boolean isCompleteTree(TreeNode root) {
    if (root == null) return true;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    boolean reachedEnd = false; // 标记是否遇到了第一个空节点
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll();
        if (node == null) {
            reachedEnd = true; // 遇到了空节点
        } else {
            if (reachedEnd) {
                // 在遇到空节点之后,又遇到了非空节点,说明不是完全二叉树
                return false;
            }
            // 无论是否为空,都将其左右孩子入队
            queue.offer(node.left);
            queue.offer(node.right);
        }
    }
    return true;
}

这个方法是我觉得最清晰易懂的一种实现,它完美捕捉了完全二叉树“左边紧凑”的特性。

4. 进阶挑战:非递归遍历与性能优化

递归代码简洁,但存在函数调用栈溢出的风险(虽然对于二叉树深度,通常不至于)。理解非递归实现,能让你对遍历过程有更本质的认识,这也是面试的高频考点。核心就是用栈来模拟递归调用的过程。

4.1 非递归前序与中序遍历

非递归前序遍历:思路是“访问一个节点,就把它右孩子、左孩子依次压栈”。但更通用的方法是模拟递归:沿着左子树一路向下访问并入栈,到头后出栈,转向右子树。

void preOrderNonRecur(TreeNode root) {
    if (root == null) return;
    Stack<TreeNode> stack = new Stack<>();
    TreeNode cur = root;
    while (cur != null || !stack.isEmpty()) {
        // 一路向左,访问并压栈
        while (cur != null) {
            System.out.print(cur.val + " "); // 访问
            stack.push(cur);
            cur = cur.left;
        }
        // 左边走到头了,弹出栈顶,转向它的右子树
        TreeNode top = stack.pop();
        cur = top.right;
    }
}

非递归中序遍历:和前序非常像,唯一的区别是访问节点的时机。前序是在入栈前访问,中序是在出栈后访问。

void inOrderNonRecur(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);
            cur = cur.left;
        }
        // 左边走到头了,弹出栈顶并访问,然后转向它的右子树
        TreeNode top = stack.pop();
        System.out.print(top.val + " "); // 访问
        cur = top.right;
    }
}

4.2 非递归后序遍历

后序遍历的非递归实现是三者中最难的,因为一个节点需要在它的左右子树都被访问后才能被访问。我们需要一个额外的指针prev来记录上一个被访问的节点,以判断右子树是否已经访问完毕。

void postOrderNonRecur(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;
        }
        cur = stack.peek(); // 看一眼栈顶,先不弹出
        // 如果栈顶节点的右子树为空,或者右子树刚被访问过,则可以访问当前节点
        if (cur.right == null || cur.right == prev) {
            System.out.print(cur.val + " ");
            stack.pop();
            prev = cur; // 更新前一个被访问的节点
            cur = null; // 当前子树处理完毕,强制从栈中取下一个节点
        } else {
            // 右子树存在且未被访问,转向右子树
            cur = cur.right;
        }
    }
}

这个算法需要多画图理解。关键点在于,当从栈中peek到一个节点时,我们要判断它的右孩子是不是“安全”的(即已访问或为空),只有安全了,才能访问它自己。

5. 融会贯通:二叉树在真实场景中的应用

学了一堆算法,最后还是要落地。二叉树在工程中的应用远比想象中广泛。

场景一:文件系统管理 操作系统中的目录结构就是一棵树(不一定是二叉树,但思想相通)。前序遍历非常适合用来列出一个目录下的所有文件和子目录(类似ls -R命令)。你可以想象,listFiles()方法内部可能就是一次前序遍历,先处理当前目录(根),再递归处理子目录(左/右子树)。后序遍历则可用于计算目录的总大小,因为必须先知道所有子目录的大小,才能汇总出当前目录的大小。

场景二:表达式树 编译器在处理算术表达式时,会将其构建成一棵二叉树。叶子节点是操作数,非叶子节点是运算符。对这棵树进行中序遍历,可以得到我们熟悉的中缀表达式(可能需要加括号)。进行后序遍历,得到的就是后缀表达式(逆波兰表示法),这种表达式特别方便计算机用栈来求值。我曾在写一个简单的计算器解析功能时用过这个思路,比直接处理字符串优先级清晰多了。

场景三:决策与分类 机器学习中的决策树模型,本质上也是一棵二叉树(或更一般的树)。从根节点开始,根据数据特征做出判断,沿着左或右分支向下,直到到达叶子节点得到最终分类结果。这个过程,就是一次从根到叶子的遍历。

场景四:高效的搜索与存储 二叉搜索树(BST)是二叉树的一个重要变种,它规定了“左子树所有节点值 < 根节点值 < 右子树所有节点值”。这个特性使得查找、插入、删除的平均时间复杂度可以达到O(log n)。Java中的TreeMap和TreeSet底层就是用红黑树(一种自平衡的二叉搜索树)实现的,保证了在各种操作下的高效性。

把这些场景和你学到的遍历、求深度、判断完全性等操作联系起来,你会发现,二叉树不再是枯燥的代码练习,而是解决实际问题的有力工具。我建议你在学完每个知识点后,都试着思考一下:“这个能在什么地方用?” 多问几个为什么,动手写几个小Demo,比如模拟一个文件浏览器,或者解析一个四则运算表达式,印象会深刻得多。数据结构的学习,理解原理是第一步,但真正掌握它,靠的是在具体问题中反复运用和调试。

Ubuntu Server 24.04 安装 (超详细) 本文介绍最小化安装 Ubuntu Server的详细过程。 阅读详情

相关推荐

点云特征提取的实战对比:Voxel-based 与 Pillar-based 在自动驾驶中的表现

本文深入对比了自动驾驶中点云特征提取的两种主流方法:Voxel-based与Pillar-based。Voxel-based方法通过三维体素化保留完整几何信息,检测精度高,但计算消耗大;Pillar-based方法将点云压缩为二维柱状特征图,牺牲部分垂直细节以换取极高的处理速度,更适合实时性要求高的量产场景。文章结合实战数据,为不同算力、精度与工程需求的场景提供了清晰的选型指南。

weixin_29045001的博客 226

二叉树的前序遍历,中序遍历,后序遍历(Java实现)

1.前序遍历    前序遍历(DLR,lchild,data,rchild),是二叉树遍历的一种,也叫做先根遍历、先序遍历、前序周游,可记做根左右。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。若二叉树为空则结束返回,否则:(1)访问根结点。(2)前序遍历左子树。(3...

coder__666的博客 8万+

从Gotham到Foundry:一文读懂Palantir三大产品线(Gotham/Foundry/Apollo)的核心差异与适用场景

本文深度解析Palantir三大产品线Gotham、Foundry和Apollo的核心差异与适用场景。Gotham专为国防与情报设计,提供军事级安全分析;Foundry是企业数字化转型的通用平台,支持低代码开发;Apollo则是云原生基石,确保系统可靠运行。通过对比产品架构与典型应用,帮助技术决策者根据需求做出明智选择。

weixin_42524499的博客 844

二叉树各种遍历算法 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

基于大模型的恶性胸腔积液全周期预测与诊疗方案研究

本研究基于大模型技术构建了恶性胸腔积液全流程预测与诊疗体系,涵盖术前风险评估、术中方案优化、术后恢复预测及并发症预防。通过整合多源医疗数据,实现了手术风险概率预测(准确率80%)、并发症预警(AUC值0.85)及个性化康复方案制定,显著提升诊疗精准度。研究创新性地将Transformer架构与多模态数据融合,在100例临床验证中显示良好性能,但存在数据样本局限、模型可解释性不足等问题。未来将扩大多中心临床验证,优化算法可解释性,探索与基因检测等技术的结合应用,推动恶性胸腔积液的精准诊疗发展。

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1901

SigFit实战:从FEA到光学仿真的热力耦合分析全流程解析

在光机系统与芯片封装等精密工程领域,热与力的耦合效应是影响产品性能与可靠性的核心物理问题。有限元分析(FEA)是预测结构在热、力载荷下变形与应力的基础工具,但其结果通常无法直接用于评估光学性能。这需要一座桥梁,将物理场数据转化为光学设计语言。其核心原理在于数据映射与面形表征技术,例如通过泽尼克多项式拟合,将离散的节点位移分解为离焦、像散等标准光学像差。这项技术的工程价值在于,它实现了多物理场仿真的闭环,使工程师能在设计阶段精准预测热变形或应力对波前误差、调制传递函数等关键光学指标的影响。其典型应用场景包括高

weixin_28630185的博客 343

Java数据结构——二叉树的遍历

一文速学二叉树的遍历

chenchenchencl的博客 9678

智能车图像处理0-图像处理整体框架思路

1.总体框架如上所示,具体代码请查看后续文章。2.因为参与竞赛时间是大二,所以在编程中有许多不规范的地方(如变量的命名),大家见谅。3.原创文章,请勿侵权=-=

taiyuezyh的博客 1万+

java中的二叉树遍历

抛出几个问题java中什么是二叉树?在java中怎么体现?怎么进行增删改查?

sutingStart的博客 1689

Java Swing教程-16. Swing中的图形绘制

这篇教程介绍了Java Swing中的图形绘制功能,主要内容包括: Graphics类的基本使用 - 介绍了如何重写paintComponent方法实现自定义绘制,以及基本图形绘制方法(线条、矩形、椭圆、多边形等) 文本与图片绘制 - 讲解了文本绘制方法、字体设置和图片加载绘制技术 颜色与字体设置 - 包括预定义颜色、RGB自定义颜色、透明色设置以及字体样式控制 案例实现 - 提供了一个简单绘图程序的框架,支持鼠标绘制不同图形、选择工具和自定义颜色等功能 教程通过代码示例详细演示了各种绘图操作,适合Java

无 234

人工智能智能体研究综述:从理论架构到前沿应用

AI Agent,即人工智能智能体,是指能够在特定环境中自主感知、推理、决策并执行行动以实现特定目标的智能系统[1]。自主性反应性主动性(Pro-activeness)和社会性fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;AI Agent核心特征自主性 Autonomy反应性 Reactivity主动性 Pro-activeness。

nmdbbzcl的博客 904

二叉树题目记录

二叉树是指度为 2 的树。它是一种最简单却又最重要的树,在计算机领域中有这广泛的应用。二叉树的递归定义如下:二叉树是一棵空树,或者一棵由一个根节点和两棵互不相交的分别称为根节点的左子树和右子树所组成的非空树,左子树和右子树同样都是一棵二叉树。在二叉树中,每个节点的左子树的根节点被称为左孩子节点,右子树被称为右孩子节点。二叉树通常使用如下数据结构来表示:data 表示二叉树节点的数值,left_child 表示节点的左孩子节点,right_child 表示节点的右孩子节点。

weixin_38184628的博客 1748

Sigrity Power SI 3D-EM Full Wave Extraction模式如何进行S参数提取和观测3D电磁场和远场实例分析(一)-差分过孔结构

Sigrity Power SI 3D-EM Full Wave Extraction模式如何进行S参数提取和观测3D电磁场和远场操作指导(一)详细介绍了3D-EM Full Wave Extraction全波S参数提取,下面以一个差分过孔结构进行实例分析,以下图为例。模式如何进行S参数提取和观测3D电磁场和远场实例分析(一)-差分过孔结构。是一个简单的4层板,top换层到bottom层的差分过孔结构。起始频率为100Mhz,截止频率为20Ghz,线性扫描。上面那根曲线是插损,下面那根线是回损。

weixin_54787054的博客 344

用Java实现二叉树的遍历

树是一种非线性结构的数据结构,有一个点没有前驱,被称为根节点,它可以有多种变化,普通二叉树,N叉树,二叉搜索树(BST),红黑树(RBTree),B树等等,上述所说的树中,普通二叉树就算是比较简单的数据结构。 二叉树的存储: 二叉树的存储方式分为:顺序存储和类似于链表的链式存储。 二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式。 我们使用孩子表示法来给大家解释一下 class TreeNode { public char val;//数据 pu

m0_61630116的博客 7008

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

shallrelow的博客 1277

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java代码实现二叉树的遍历

一、二叉树的定义: 二叉树是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。     二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。     这个定义

想飞的企鹅 4615

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java 二叉树层次遍历

Java 二叉树层次遍历

tracy的博客 7202

JAVA遍历二叉树

二叉树的概念    二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点。 现在我们给出一组二叉树 二叉树遍历又分为先序遍历(根节点-左子树 -右子树 )、中序遍历(左子树 -根节点-

The Best Or Nothing~ 5335

二叉树遍历——Java代码实现

二叉树遍历——Java的代码实现二叉树二叉树的遍历代码实现首先创建一个结点其次是进行遍历操作的BinaryTree类递归实现二叉树遍历方法详述(以中序遍历为例)主函数输出结果 二叉树 二叉树是树的一种,每个结点最多可具有两个子树,即结点的度最大为2。 二叉树的遍历 先序遍历:先访问根节点,然后访问左节点,最后访问右节点。 【1->2->4->8->9->5->10->3->6->7】 中序遍历:先访问左节点,然后访问根节点,最后访问右节点。 【8-&g

qq_40727800的博客 1637

Java 遍历二叉树

二叉树的核心操作 把所有的节点,按一定的次序,全部访问(针对这个数据,进行各种操作如:打印,修改,判定,计算......)一遍,访问过程中“不重不漏”。 分为:先序遍历、中序遍历、后序遍历、层序遍历 你都已看不到我们的好,我还为谁牵挂 ,你爱我还是他,是否沉默就是你的回答,我们都别挣扎 去爱他 DT

LL_break的博客 1199

蓝桥杯 Java B 组 之树的基础(二叉树遍历)

/ 递归访问左子树。// 递归访问左子树。// 递归访问左子树。System.out.print("前序遍历:");System.out.print("中序遍历:");System.out.print("后序遍历:");

2301_77523055的博客 1223

遍历二叉树(Java实现)

原理 二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。 二叉树的遍历次序大多是从头至尾、循环、双向等简单的遍历方式。 树的结点之间不存在唯一的前驱和后继关系,在访问一个结点后,下一个被访问的结点面临着不同的选择。 方法 二叉树的遍历方法 1、前序遍历 规则是若二叉树为空,则空操作返回, 否则先访问根结点,然后前序遍历左子树,在前序遍历右子树。 如下图所示: ✅前序遍历结果:ABDECF 遍历算法:

qq_41924554的博客 3277

java版遍历二叉树

首先编写二叉树类BinaryTree,代码如下: package package2; public class BinaryTree { int data; //根节点数据 BinaryTree left; //左子树 BinaryTree right; //右子树 public BinaryTree(int data) //实例化二叉树类 { t...

席同学的博客 1810

二叉树算法精解(Java 实现):从遍历到高阶应用

int val;上述代码定义了TreeNode类,每个节点包含一个值val,以及指向左子节点left和右子节点right的引用,同时提供了不同的构造函数方便节点创建。掌握二叉树算法的关键在于理解树形结构的递归本质,并熟练运用各种遍历框架来解决各类问题。从基础的遍历操作到复杂的算法应用,都需要通过大量的练习来加深理解。建议读者从本文的基础代码和题目入手,逐步挑战 LeetCode 上更多经典题目,在实践中实现从量变到质变的提升。

2202_75601845的博客 1062

二叉树的递归遍历:Java语言实现

1 前言      所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。       由于二叉树的递归遍历相对与非递归遍历而言,形式统一,代码简单,比较容易理解。所以,本文先用Java实现二叉树的递归遍历方法。下篇博文介绍非递归遍历的实现。2 二叉树的...

cqulun123的博客 1044
上一篇: 为什么你的局域网速度慢?集线器和交换机的带宽分配原理详解
下一篇: 基于多源数据融合的城市地下综合管廊智慧化运营体系构建
java5
博客等级 码龄22年 85粉丝 2103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值