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

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

树形结构模拟现实层级关系,节点间存在层次关联。二叉树作为特殊形式,每个节点最多含左右子树。类型包括满二叉树与完全二叉树,后者常用于堆实现。二叉树性质涉及层数节点数关系及父子节点索引计算。存储方式涵盖顺序存储与链式存储(孩子表示法、双亲表示法等)。基本操作包含手动创建、前序中序后序遍历以及统计节点数、叶子数、高度和查找元素等方法。掌握这些基础有助于理解红黑树等复杂结构。

t ag发布于 2026/3/24更新于 2026/9/1067 浏览
Java 数据结构:从树形结构到二叉树详解

在这里插入图片描述

🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏: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 size(Node root) {
    if (root == null) {
        return 0;
    }
    return size(root.left) + size(root.right) + 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 getHeight(Node root) {
    if (root == null) {
        return 0;
    }
    int leftH = getHeight(root.left);
    int rightH = getHeight(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;
    }
    return find(root.right, val);
}

三、总结

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

目录

  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. 三、总结

更多推荐文章

查看全部
  • C++ 入门进阶:输入输出、缺省参数与函数重载
  • 任意文件读取漏洞的深入利用与敏感文件路径分析
  • 秋叶绘世 Stable Diffusion 整合包功能说明
  • Spring MVC 核心架构与注解详解
  • 5.8G 模拟图传电路设计与性能实战
  • 《Virt-A-Mate》虚拟实境交互软件功能介绍
  • VS2017 C2440 错误解析:C++ const char[] 类型安全演进
  • 用 ImGui 快速搭一个 C++ 调试面板
  • 百度文心 5.0 发布:2.4 万亿参数与原生全模态解析
  • Django REST Framework 企业级 API 架构设计与实战
  • 11 篇必读的大模型论文
  • Nginx 高可用方案:基于 Keepalived 的双机热备实战
  • 单链表核心操作实现与指针思维解析
  • WSL Ubuntu 24 配置 root 密码并默认登录
  • HTTP 请求方式详解:GET、POST 及其他常用方法
  • 向日葵 MCP 服务器接入 AI Agent 实现跨设备远程控制
  • VS Code Claude Code YOLO 插件配置与使用指南
  • 前端 AJAX 与 XMLHttpRequest 核心知识点及实战
  • Anaconda 环境变量配置意义及捆绑 Python 路径说明
  • 国内 20 家大厂大模型岗位面试复盘与技术要点总结

相关免费在线工具

  • 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