news 2026/4/13 11:05:35

Java 二叉树实战:构建、遍历与查找的完整实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 二叉树实战:构建、遍历与查找的完整实现

目录

引入:

一、二叉树节点的定义

二、二叉树的构建(插入节点)

三、二叉树的遍历

3.1深度优先遍历

3.1.1先序遍历(根 → 左 → 右)

3.1.2中序遍历(左 → 根 → 右)

3.1.3后序遍历(左 → 右 → 根)

3.2广度优先遍历

四、二叉树的查找

五、完整测试代码

六、输出结果

七、总结


引入:

二叉树是数据结构中的基础结构之一,常用于实现排序、查找等功能。本文将基于 Java 实现二叉树的构建、深度优先遍历(先序/中序/后序)、广度优先遍历与查找,并通过代码示例详解核心逻辑。

一、二叉树节点的定义

二叉树的基本单元是“节点”,每个节点包含左子节点、右子节点、数据域三个部分,对应 Java 类的实现如下:

/** * 二叉树节点类 */ public class TreeNode { // 左子节点 public TreeNode lChild; // 右子节点 public TreeNode rChild; // 数据域 public Integer data; // 构造方法 public TreeNode(Integer data) { this.data = data; } }

二、二叉树的构建(插入节点)

二叉树的构建逻辑是按“左小右大”的规则插入节点:

  1. 若树为空,新节点作为根节点;
  2. 若树非空,从根节点开始比较:( 新节点数据 > 当前节点数据 → 插入到右子树; 新节点数据 ≤ 当前节点数据 → 插入到左子树;)
  3. 循环查找,直到找到空的子节点位置,插入新节点。

代码实现

/** * 二叉树类 */ public class BinaryTree { // 根节点 public TreeNode root; /** * 插入节点(构建二叉树) * @param value 要插入的数据 */ public void create(Integer value) { // 1. 创建新节点 TreeNode newNode = new TreeNode(value); // 2. 若树为空,新节点作为根节点 if (root == null) { root = newNode; return; } // 3. 从根节点开始遍历,找到插入位置 TreeNode curNode = root; while (true) { // 新节点数据 > 当前节点数据 → 插入右子树 if (curNode.data < newNode.data) { if (curNode.rChild == null) { curNode.rChild = newNode; return; } curNode = curNode.rChild; } else { // 新节点数据 ≤ 当前节点数据 → 插入左子树 if (curNode.lChild == null) { curNode.lChild = newNode; return; } curNode = curNode.lChild; } } } }

测试示例

插入数据 `5、7、2、6、0、4、3、1`,构建的二叉树结构如下:

三、二叉树的遍历

二叉树的深度优先遍历分为先序、中序、后序三种(以根节点的访问时机区分),通常采用递归实现。

3.1深度优先遍历

3.1.1先序遍历(根 → 左 → 右)

先访问根节点,再递归遍历左子树,最后递归遍历右子树。

/** * 先序遍历 * @param root 遍历的起始节点 */ public void beforeOrder(TreeNode root) { if (root == null) { return; } // 1. 访问根节点 System.out.print(root.data + " "); // 2. 遍历左子树 beforeOrder(root.lChild); // 3. 遍历右子树 beforeOrder(root.rChild); }
  • 遍历结果:5 2 0 1 4 3 7 6

3.1.2中序遍历(左 → 根 → 右)

先递归遍历左子树,再访问根节点,最后递归遍历右子树。

/** * 中序遍历 * @param root 遍历的起始节点 */ public void inOrder(TreeNode root) { if (root == null) { return; } // 1. 遍历左子树 inOrder(root.lChild); // 2. 访问根节点 System.out.print(root.data + " "); // 3. 遍历右子树 inOrder(root.rChild); }
  • 遍历结果:0 1 2 3 4 5 6 7(注:二叉排序树的中序遍历结果是有序的)

3.1.3后序遍历(左 → 右 → 根)

先递归遍历左子树,再递归遍历右子树,最后访问根节点。

/** * 后序遍历 * @param root 遍历的起始节点 */ public void afterOrder(TreeNode root) { if (root == null) { return; } // 1. 遍历左子树 afterOrder(root.lChild); // 2. 遍历右子树 afterOrder(root.rChild); // 3. 访问根节点 System.out.print(root.data + " "); }
  • 遍历结果:1 0 3 4 2 6 7 5

3.2广度优先遍历

又叫层次优先遍历

  • 上图的广度优先遍历结果为:5 2 7 0 4 6 1 3

四、二叉树的查找

查找逻辑与构建逻辑一致:从根节点开始比较,根据“左小右大”的规则遍历,直到找到目标节点或遍历到空节点。

代码实现

/** * 查找节点 * @param root 查找的起始节点 * @param value 要查找的数据 * @return 找到的节点(未找到返回null) */ public TreeNode findNode(TreeNode root, Integer value) { if (root == null) { return null; } TreeNode curNode = root; while (true) { if (curNode.data.equals(value)) { return curNode; } else if (curNode.data < value) { if (curNode.rChild == null) { return null; } curNode = curNode.rChild; } else { if (curNode.lChild == null) { return null; } curNode = curNode.lChild; } } }

五、完整测试代码

public class Test { public static void main(String[] args) { BinaryTree bt = new BinaryTree(); // 插入节点构建二叉树 bt.create(5); bt.create(7); bt.create(2); bt.create(6); bt.create(0); bt.create(4); bt.create(3); bt.create(1); // 先序遍历 System.out.print("先序遍历:"); bt.beforeOrder(bt.root); System.out.println(); // 中序遍历 System.out.print("中序遍历:"); bt.inOrder(bt.root); System.out.println(); // 后序遍历 System.out.print("后序遍历:"); bt.afterOrder(bt.root); System.out.println(); // 查找节点 TreeNode findNode = bt.findNode(bt.root, 4); System.out.println("查找值为4的节点:" + (findNode != null ? findNode.data : "未找到")); } }

六、输出结果

  • 先序遍历:5 2 0 1 4 3 7 6
  • 中序遍历:0 1 2 3 4 5 6 7
  • 后序遍历:1 0 3 4 2 6 7 5
  • 查找值为4的节点:4

七、总结

本文实现了二叉树的核心操作:

  1. 构建:按“左小右大”规则插入节点,形成二叉排序树;
  2. 遍历:通过递归实现先序、中序、后序遍历,其中中序遍历结果是有序的;
  3. 查找:基于“左小右大”规则遍历树,时间复杂度为O(logn)(平衡二叉树)。

二叉树是后续学习平衡二叉树、红黑树等高级结构的基础,掌握其核心操作能帮助你理解更复杂的数据结构逻辑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 16:05:42

RV1126 NO.55:ROCKX+RV1126人脸识别推流项目讲解

一.本项目的介绍本项目基于视频采集与人脸识别技术&#xff0c;主要实现以下核心功能&#xff1a;通过摄像头采集视频数据&#xff0c;利用人脸识别技术将识别结果实时叠加到视频画面上&#xff0c;并推送至流媒体服务器。系统整合了多项关键技术模块&#xff0c;包括&#xff…

作者头像 李华
网站建设 2026/4/8 6:03:06

零基础入门:什么是.NET Framework 3.5及如何安装

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式.NET Framework 3.5学习应用&#xff0c;包含&#xff1a;1) 基础知识讲解模块 2) 分步骤安装向导 3) 常见问题解答库 4) 实时错误诊断 5) 学习进度跟踪。要求界面友…

作者头像 李华
网站建设 2026/4/3 6:21:20

长沙网安培训“潜规则”:只分两种,湖南网安基地和其他

摘要&#xff1a;​ 在长沙想成为网络安全工程师&#xff1f;你会发现市场看似选择众多&#xff0c;但懂行的人只会告诉你一个真相&#xff1a;要么选湖南网安基地&#xff0c;要么就是在“试错”。这篇文章为你深度剖析长沙网安培训的行业现状&#xff0c;告诉你为什么湖南网安…

作者头像 李华
网站建设 2026/4/3 1:29:56

Notepad++在数据处理中的高效应用案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Notepad宏脚本&#xff0c;用于自动化处理日志文件。功能包括&#xff1a;按时间戳过滤日志条目&#xff0c;高亮显示错误和警告信息&#xff0c;统计各类消息出现频率&…

作者头像 李华
网站建设 2026/4/9 23:12:18

Vulkan教程(七):物理设备与队列族,选择合适的显卡并理解队列机制

目录 一、物理设备选择流程 1.1 扩展代码框架 1.1.1 添加初始化函数调用 1.1.2 添加物理设备成员变量 1.2 枚举系统中的物理设备 二、设备适配性检查 2.1 基础设备信息查询 2.2 简单适配性判断 2.3 加权评分选择(进阶方案) 2.4 本教程的适配性筛选逻辑 三、队列族…

作者头像 李华
网站建设 2026/4/11 13:57:12

“降重不是‘文字马赛克’,是学术表达的‘二次创作’——宏智树AI降重降AIGC,让AI生成内容重获‘人味儿’”

在AI写作席卷学术圈的今天&#xff0c;一个新困境悄然浮现&#xff1a; 你用AI高效写出了初稿&#xff0c;却被导师或查重系统无情标记&#xff1a;“疑似AIGC生成”“语言模板化”“缺乏个人风格”。 于是&#xff0c;你开始疯狂改写——同义词替换、语序倒装、删减句子……结…

作者头像 李华