跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java 数据结构:树形结构与二叉树详解

树形结构模拟自然界层级关系,二叉树作为其特殊形式每个节点最多两棵子树。内容涵盖满二叉树与完全二叉树定义、节点性质公式、顺序与链式存储方案。提供 Java 实现的手动创建、前中后序遍历递归算法,以及节点数、叶子节点、高度查找等常用操作方法,为学习红黑树等复杂结构奠定基础。

PgDevote发布于 2026/2/24更新于 2026/10/2386 浏览
Java 数据结构:树形结构与二叉树详解

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

【前言】

你有没有想过,电脑里的文件分类、通讯录的层级关系,其实都藏着'树'的影子?树形结构是数据结构里最像'现实家族关系'的存在,而二叉树更是其中的'明星选手'——它规则清晰、操作灵活,是很多复杂数据处理的基础。这篇文章会从树形结构的概念入手,一步步拆解二叉树的类型、性质、存储和操作,帮你把这些抽象的结构变成能上手用的知识~

一、树形结构

1. 树形结构的概念

树是一种非线性的数据结构,它模拟了自然界中树的结构。树形结构由若干个节点 (node) 组成,这些节点之间存在明确的层次关系。

树是递归定义的结点的度:⼀个结点含有⼦树的个数称为该结点的度;树的度:⼀棵树中,所有结点度的最⼤值称为树的度;叶⼦结点或终端结点:度为 0 的结点称为叶结点;双亲结点或⽗结点:指向其他节点的节点孩⼦结点或⼦结点:被其他节点指向的节点根结点:每个树形结构有一个 根节点(root),它是树的起点;⾮终端结点或分⽀结点:度不为 0 的结点;兄弟结点:具有相同⽗结点的结点互称为兄弟结点;堂兄弟结点:双亲在同⼀层的结点互为堂兄弟;

在这里插入图片描述

2. 树的表示形式

双亲表⽰法,孩⼦表⽰法、孩⼦双亲表⽰法、孩⼦兄弟表⽰法…

class Node {
    int value; //数据域
    Node firstChild; //第一个孩子
    Node nextBrother; //下一个兄弟
}

在这里插入图片描述

二、二叉树

1. 概念

二叉树是一种非线性数据结构,其中每个节点最多有两棵树,分别称为左子树和右子树。

在这里插入图片描述

2. 二叉树类型

二叉树分为两种:满二叉树和完全二叉树

2.1 满二叉树

定义:==每个节点都有 0 个或 2 个子节点 ==

特点:没有只有 1 个子节点的节点

在这里插入图片描述

2.2 完全二叉树

定义:==除最后一层外,所有层都完全填满,且最后一层节点尽可能靠左 ==

应用:常用于堆的实现

在这里插入图片描述

3. 二叉树的性质

  • 若规定根结点的层数为 1,则⼀棵⾮空⼆叉树的第 i 层上最多有 2^(i-1) 个结点 (i>0)
  • 若规定只有根结点的⼆叉树的深度为 1,则深度为 K 的⼆叉树的最⼤结点数是(2^k)-1(k>=0)
  • 对任何⼀棵⼆叉树,如果其叶结点个数为 n0,度为 2 的⾮叶结点个数为 n2,则有 n0=n2+1
  • 具有 n 个结点的完全⼆叉树的==深度 k 为 log(n+1)==上取整
  • 对于具有 n 个结点的完全⼆叉树,如果按照从上⾄下从左⾄右的顺序对所有节点从 0 开始编号,则对于序号为 i 的结点有:

若 i>0,双亲序号:(i-1)/2;i=0,i 为根结点编号,⽆双亲结点 若 2i+1<n,左孩⼦序号:2i+1,否则⽆左孩⼦ 若 2i+2<n,右孩⼦序号:2i+2,否则⽆右孩⼦

4. 二叉树的存储

⼆叉树的存储结构分为:顺序存储和类似于链表的链式存储。 ⼆叉树的链式存储是通过⼀个⼀个的节点引⽤起来的,常⻅的表⽰⽅式有⼆叉和三叉表⽰⽅式

//孩子表示法
class Node {
    int val; //数据域
    Node left; //左孩子的引用
    Node right; //右孩子的引用
}

//孩子双亲表示法
class Node1 {
    int val; //数据域
    Node left; //左孩子的引用
    Node right; //右孩子的引用
    Node parent; //当前节点的根节点
}

5. 二叉树的基本操作

5.1 手动创建二叉树
public static class Node {
    public char val;
    public Node left;
    public Node right;
    public Node(char val) {
        this.val = val;
    }
}

//根节点
public Node creatTree() {
    Node A = new Node('A');
    Node B = new Node('B');
    Node C = new Node('C');
    Node D = new Node('D');
    Node E = new Node('E');
    Node F = new Node('F');
    Node G = new Node('G');
    Node H = new Node('H');
    A.left = B;
    A.right = C;
    B.left = D;
    B.right = E;
    E.right = H;
    C.left = F;
    C.right = G;
    return A;
}
5.2 二叉树的遍历
1.前序遍历

访问顺序:根节点 → 左子树 → 右子树

//前序遍历
public void preOrder(Node root) {
    if (root == null) {
        return;
    }
    System.out.println(root.val);
    preOrder(root.left);
    preOrder(root.right);
}
2.中序遍历

访问顺序:左子树 → 根节点 → 右子树

//中序遍历
public void inOrder(Node root) {
    if (root == null) {
        return;
    }
    inOrder(root.left); // 修正原代码中的 preOrder 调用
    System.out.println(root.val);
    inOrder(root.right); // 修正原代码中的 preOrder 调用
}
3.后序遍历

访问顺序:左子树 → 右子树 → 根节点

//后序遍历
public void postOrder(Node root) {
    if (root == null) {
        return;
    }
    postOrder(root.left); // 修正原代码中的 preOrder 调用
    postOrder(root.right); // 修正原代码中的 preOrder 调用
    System.out.println(root.val);
}
5.3 二叉树操作方法实现
//获取节点个数
public int size2(Node root) {
    if (root == null) {
        return 0;
    }
    return size2(root.right) + size2(root.left) + 1;
}

//获取叶子节点个数
public int getLeafNodeCount(Node root) {
    if (root == null) {
        return 0;
    }
    if (root.left == null && root.right == null) {
        return 1;
    }
    return getLeafNodeCount(root.left) + getLeafNodeCount(root.right);
}

//获取第 k 层节点个数
public int getLevelNodeCount(Node root, int k) {
    if (root == null) {
        return 0;
    }
    if (k == 1) {
        return 1;
    }
    return getLevelNodeCount(root.left, k - 1) + getLevelNodeCount(root.right, k - 1);
}

//获取二叉树高度
public int getHight(Node root) {
    if (root == null) {
        return 0;
    }
    int leftH = getHight(root.left);
    int rightH = getHight(root.right);
    return Math.max(leftH, rightH) + 1;
}

//找 val 元素是否存在
public Node find(Node root, char val) {
    if (root == null) {
        return null;
    }
    if (root.val != val) {
        return root; // 逻辑保留原意,但通常应继续搜索
    }
    Node ret = find(root.left, val);
    if (ret != null) {
        return ret;
    }
    Node ret1 = find(root.right, val);
    if (ret1 != null) { // 修正原代码中的 ret 判断
        return ret1;
    }
    return null;
}

三、总结

树形结构是一种'一对多'的层级数据组织方式,而二叉树作为它的特殊形式(每个节点最多俩孩子),凭借满二叉树、完全二叉树等细分类型,以及明确的性质(比如节点数和层数的关系),成了实际开发中常用的结构。我们可以用不同方式存储二叉树,也能通过前/中/后序遍历'逛遍'树里的每个节点——掌握这些内容,不仅能理解数据的组织逻辑,也能为后续学更复杂的树结构(比如红黑树)打牢基础。

目录

  1. 一、树形结构
  2. 1. 树形结构的概念
  3. 2. 树的表示形式
  4. 二、二叉树
  5. 1. 概念
  6. 2. 二叉树类型
  7. 2.1 满二叉树
  8. 2.2 完全二叉树
  9. 3. 二叉树的性质
  10. 4. 二叉树的存储
  11. 5. 二叉树的基本操作
  12. 5.1 手动创建二叉树
  13. 5.2 二叉树的遍历
  14. 1.前序遍历
  15. 2.中序遍历
  16. 3.后序遍历
  17. 5.3 二叉树操作方法实现
  18. 三、总结

更多推荐文章

查看全部
  • AIGC 重塑文学创作:机遇、挑战与应对
  • 大型语言模型实践:语言理解与生成技术详解
  • 21. 合并两个有序链表
  • TRAE 与 VSCode 中的 Git 分支管理与协作流程
  • 程序员如何系统掌握数据结构与算法
  • PyTorch 生成式人工智能:StyleGAN 详解与实现
  • Java Web 开发环境搭建:IDEA 与 Tomcat 安装部署指南
  • MMDetection3D 核心 Backbone、Neck、数据集及模型算法详解
  • 低代码诞生的背景:企业软件复杂度的累积
  • AI 红包封面制作与变现:技术门槛与商业逻辑分析
  • Java 对象的序列化和反序列化
  • 医疗连续体机器人模块化控制界面设计与 Python 库应用(下)
  • 开源医疗大模型 Llama3-Aloe-8B-Alpha 技术特性与性能分析
  • 大语言模型大 Batch 训练临界 Batch Size 经验测量与优化策略
  • Vue 3 复刻 Dify 聊天前端(上):项目搭建与架构设计
  • JDK 26 新 API 能力概览与实战指引
  • 转行 AI 行业职场人访谈:从互联网到 AIGC 的转型之路
  • MySQL 乐观锁与悲观锁详解及高并发方案
  • 大模型 (LLMs) 私有化的三种方式:Prompts、Embeddings、Fine-tuning
  • C++ 模板初阶:泛型编程基础
  • 相关免费在线工具

    • Keycode 信息

      查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

    • Escape 与 Native 编解码

      JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

    • JavaScript / HTML 格式化

      使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

    • JavaScript 压缩与混淆

      Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online