news 2026/4/24 8:24:23

《Java数据结构与算法》第四篇(二)二叉树的性质、定义与链式存储实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《Java数据结构与算法》第四篇(二)二叉树的性质、定义与链式存储实现

二叉树的性质、定义与链式存储实现

前言:今天我们来深入学习数据结构中的重要概念——二叉树。作为树形结构中最基础也是最重要的类型,二叉树在计算机科学中有着广泛的应用。本文将从基本概念出发,重点讲解二叉树的链式存储实现。

一、什么是二叉树?

1.1 二叉树的定义

二叉树是每个节点最多有两个子树的有序树,通常子树被称作"左子树"和"右子树"。

特点:

  • 每个节点最多有两个子节点(度≤2)
  • 子树有左右之分,次序不能颠倒
  • 二叉树可以是空树,也可以是由根节点和左右子树组成

1.2 二叉树的基本性质

性质1:在二叉树的第i层上最多有2^(i-1)个节点(i≥1)

性质2:深度为k的二叉树最多有2^k - 1个节点(k≥1)

性质3:对于任何一棵二叉树,如果其终端节点数为n₀,度为2的节点数为n₂,则n₀ = n₂ + 1

性质4:具有n个节点的完全二叉树的深度为⌊log₂n⌋ + 1

二、二叉树的存储表示

2.1 顺序存储结构

顺序存储适用于完全二叉树,使用数组来存储节点:

// 顺序存储示例(仅展示概念)// 节点i的左孩子:2i,右孩子:2i+1,父节点:i/2// 数组索引:[0, 1, 2, 3, 4, 5, 6, 7]// 对应节点:[A, B, C, D, E, F, G, H]

优点:

  • 存储空间利用率高
  • 节点关系明确,通过下标计算即可获得父子关系

缺点:

  • 对于非完全二叉树,空间浪费严重
  • 插入、删除操作不方便

2.2 链式存储结构(重点!)

链式存储是二叉树最常用的存储方式,每个节点包含数据域和指向左右孩子的指针域。

三、二叉树链式存储的Java实现

下面我们来看完整的链式存储实现:

packagechapter4;publicclassBiTree{BiTreeNoderoot;// 根节点intnum;// 节点总数publicBiTree(){root=newBiTreeNode();num=0;}privateintpi=0;// 创建二叉树的公共接口publicvoidcreateBiTree(Stringinput){pi=0;// 重置位置指针root=createBiTreeHelper(input);num=countNodes(root);// 统计节点数}// 递归创建二叉树的辅助方法privateBiTreeNodecreateBiTreeHelper(Stringinput){if(pi>=input.length()||input.charAt(pi)=='#'){pi++;// 跳过'#'returnnull;// 空节点}// 创建当前节点BiTreeNoderoot=newBiTreeNode(input.charAt(pi));pi++;// 移动到下一个字符// 递归创建左子树root.lchild=createBiTreeHelper(input);// 递归创建右子树root.rchild=createBiTreeHelper(input);returnroot;}// 计算节点总数的递归方法privateintcountNodes(BiTreeNoderoot){if(root==null){return0;}// 1(当前节点) + 左子树节点数 + 右子树节点数return1+countNodes(root.lchild)+countNodes(root.rchild);}}// 二叉树节点类classBiTreeNode{chardata;// 数据域BiTreeNodelchild;// 左孩子指针BiTreeNoderchild;// 右孩子指针// 无参构造函数publicBiTreeNode(){}// 带数据的构造函数publicBiTreeNode(chardata){this.data=data;lchild=null;rchild=null;}// 完整构造函数publicBiTreeNode(chardata,BiTreeNodelchild,BiTreeNoderchild){this.data=data;this.lchild=lchild;this.rchild=rchild;}}

代码详解

3.1 核心设计思想

  1. 节点设计BiTreeNode类采用经典的"数据域 + 左孩子 + 右孩子"三要素设计
  2. 递归创建:使用先序遍历的思想递归构建二叉树
  3. 空节点标记:使用’#'字符表示空节点,这是二叉树序列化的常用技巧

3.2 关键方法解析

createBiTreeHelper方法解析:

privateBiTreeNodecreateBiTreeHelper(Stringinput){if(pi>=input.length()||input.charAt(pi)=='#'){pi++;// 别忘了移动指针!returnnull;}BiTreeNoderoot=newBiTreeNode(input.charAt(pi));pi++;// 处理完当前字符后移动// 先序遍历:根 → 左 → 右root.lchild=createBiTreeHelper(input);root.rchild=createBiTreeHelper(input);returnroot;}

输入示例:对于字符串 “ABD##E##CF##G##”

  • A:根节点
  • B:A的左孩子
  • D:B的左孩子
  • ##:D的左右孩子都为空
  • E:B的右孩子
  • ##:E的左右孩子都为空
  • 以此类推…

3.3 技术亮点

  1. 递归思想:整个创建过程体现了递归的优雅
  2. 边界处理:正确处理了空节点和越界情况
  3. 节点统计:通过递归精确计算节点总数
  4. 封装设计:将递归细节封装在私有方法中,提供简洁的公共接口

四、应用场景

这种链式存储实现适用于:

  • 表达式树的构建和计算
  • 哈夫曼树的构造
  • 二叉搜索树的操作
  • AVL树红黑树等平衡树的实现

五、总结

通过本文的学习,我们掌握了:

  1. 二叉树的基本性质和定义
  2. 顺序存储与链式存储的对比
  3. 链式存储的完整Java实现
  4. 递归创建二叉树的核心技巧

二叉树的链式存储虽然需要额外的指针空间,但其灵活性和操作便利性使其成为实际应用中的首选存储方式。


💪学习建议:动手实现这个代码,尝试不同的输入字符串,观察二叉树的构建过程。理解递归在树结构中的重要作用,这将为后续学习更复杂的树形结构打下坚实基础!
下期预告:二叉树的便利

如果觉得本文对你有帮助,别忘了点赞👍收藏❤️关注哦!有什么问题欢迎在评论区讨论交流!

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

基于Kotaemon的生产级RAG系统搭建全指南

基于Kotaemon的生产级RAG系统搭建全指南 在大模型能力不断突破的今天,企业早已不再满足于“能说会道”的聊天机器人。真正有价值的AI系统,必须能在复杂业务场景中准确回答问题、执行操作,并且每一步决策都可追溯、可审计。然而现实是&#xf…

作者头像 李华
网站建设 2026/4/22 4:04:05

EmotiVoice语音合成引擎的可扩展性架构设计

EmotiVoice语音合成引擎的可扩展性架构设计 在虚拟偶像能开演唱会、AI客服可以“共情”用户情绪的今天,语音合成早已不再是简单地把文字读出来。人们期待的是有温度、有性格、甚至能“演戏”的声音——这背后,是对TTS系统前所未有的灵活性与表现力挑战。…

作者头像 李华
网站建设 2026/4/20 1:07:25

基于python的中文起点网top500小说数据提取的设计与实现_12qz0syp

文章目录 系统截图项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式! 系统截图 基于pythontop_2qzsyp 小说数据提取的设计与实现的中文起点网 项目简介 本…

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

Kotaemon权限控制系统设计满足企业合规要求

Kotaemon权限控制系统设计满足企业合规要求 在金融、医疗和政务等高度监管的行业中,部署智能对话系统早已不再是“能不能答对问题”的技术验证,而是“是否可信、可管、可审计”的治理命题。当企业将RAG(检索增强生成)智能体用于客…

作者头像 李华
网站建设 2026/4/22 11:45:41

12、Linux系统中的进程间通信与多线程编程

Linux系统中的进程间通信与多线程编程 在Linux系统的开发中,进程间通信(IPC)和多线程编程是两个非常重要的概念,它们能够帮助开发者更高效地利用系统资源,提升应用程序的性能。下面将详细介绍相关的技术细节和实际应用。 信号信息结构体与超时设置 在Linux系统中,信号…

作者头像 李华