树与二叉树:数据结构的核心精髓
一、树型结构1.基本定义树形结构是一种非线性的数据结构用于模拟具有层次关系的数据。它由节点Node和边Edge组成其中每个节点可以有零个或多个子节点但至多只有一个父节点除了根节点外没有父节点。树型结构具有以下显著特点层次分明树中的节点按层级组织从根节点向下逐层展开形成清晰的父子关系便于表达数据的从属和包含关系。唯一根节点每棵树有且仅有一个根节点它是整个结构的起点没有父节点所有其他节点都直接或间接从根节点延伸而来。无环连通树中任意两个节点之间只有一条路径不存在回路因此树是一种连通且无环的特殊图结构。递归定义树的每个子树本身也是一棵树这种递归特性使得树的遍历、查找和构建都可以用递归算法简洁高效地实现。节点关系明确每个节点除根节点外有且仅有一个父节点但可以有多个子节点这种一对多的关系非常适合描述分类、目录和组织架构等场景。注意事项1.子树是不可相交的2.除了根节点外每个节点有且只有一个父节点3.一颗N个节点的树有N - 1条边2.概念重要结点的度一个结点含有子树的个数称为该结点的度如上图A的度为6。树的度一棵树中所有结点度的最大值称为树的度如上图树的度为6。叶子结点或终端结点度为0的结点称为叶结点如上图B、C、H、I等结点为叶结点。双亲结点或父结点若一个结点含有子结点则这个结点称为其子结点的父结点如上图A是B的父结点。孩子结点或子结点一个结点含有的子树的根结点称为该结点的子结点如上图B是A的孩子结点。根结点一棵树中没有双亲结点的结点如上图A。结点的层次从根开始定义起根为第1层根的子结点为第2层以此类推。树的高度或深度树中结点的最大层次如上图树的高度为4。非终端结点或分支结点度不为0的结点如上图D、E、F、G等结点为分支结点。兄弟结点具有相同父结点的结点互称为兄弟结点如上图B、C是兄弟结点。堂兄弟结点双亲在同一层的结点互为堂兄弟如上图H、I互为堂兄弟结点。结点的祖先从根到该结点所经分支上的所有结点如上图A是所有结点的祖先。子孙以某结点为根的子树中任一结点都称为该结点的子孙如上图所有结点都是A的子孙。森林由mm≥0棵互不相交的树组成的集合称为森林。3.树的表示形式树的存储结构有多种表示形式常见的有双亲表示法、孩子表示法、孩子兄弟表示法等。下面重点介绍孩子表示法。孩子表示法由于树中每个结点可能有多棵子树因此可以把每个结点的所有孩子结点排列起来形成一个线性表通常用单链表存储称为该结点的孩子链表。对于 n 个结点的树共有 n 个孩子链表叶子结点的孩子链表为空表。代码举例class Node { int value;// 树中存储的数据 Node firstChild;// 第一个孩子引用 Node nextBrother;// 第二个孩子的引用 }二、二叉树1.概念二叉树是每个结点至多只有两棵子树即每个结点的度不超过 2的树结构且两棵子树有左右之分次序不能颠倒。二叉树是树形结构中应用最广泛的一种特殊形态其递归定义如下空树空二叉树是一棵二叉树。递归构成一棵二叉树由根结点、左子树和右子树三部分组成其中左子树和右子树本身也都是二叉树。二叉树与普通树的区别主要体现在以下两点度受限二叉树中每个结点的度最大为 2而普通树中结点的度没有上限。左右有序二叉树的子树有左右之分即使某个结点只有一棵子树也必须区分它是左子树还是右子树而普通树不区分子树的次序。根据结点的分布情况两种特殊的二叉树满二叉树一棵深度为 k 的二叉树若共有 2^k - 1 个结点则称为满二叉树。满二叉树中每一层的结点数都达到最大值。完全二叉树深度为 k 的二叉树若其第 1 层到第 k-1 层都是满的且第 k 层的结点都连续集中在左侧则称为完全二叉树。完全二叉树适合用数组顺序存储。二叉树具有以下重要性质1. 若规定根结点的层数为1则一棵非空二叉树的第i层上最多有2^i - 1(i0)个结点2. 若规定只有根结点的二叉树的深度为1则深度为K的二叉树的最大结点数是2^k - 1(k0)3. 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0n214. 具有n个结点的完全二叉树的深度k为上取整5. 对于具有n个结点的完全二叉树如果按照从上至下从左至右的顺序对所有节点从0开始编号则对于序号为i 的结点有若i0双亲序号(i-1)/2i0i为根结点编号无双亲结点若2i1 n左孩子的序号2i 1否则无左孩子若2i2 n左孩子的序号2i 2否则无左孩子2.二叉树的遍历二叉树的遍历是指按照某种规则访问树中每个结点一次且仅一次的过程。根据访问根结点与左右子树的先后顺序二叉树主要有以下三种深度优先遍历方式前序遍历先根遍历先访问根结点再遍历左子树最后遍历右子树。访问顺序为根结点 → 左子树 → 右子树。中序遍历中根遍历先遍历左子树再访问根结点最后遍历右子树。访问顺序为左子树 → 根结点 → 右子树。后序遍历后根遍历先遍历左子树再遍历右子树最后访问根结点。访问顺序为左子树 → 右子树 → 根结点。除了上述三种深度优先遍历外还有一种按层访问的遍历方式层序遍历从根结点开始按照从上至下、从左至右的顺序逐层访问每个结点通常借助队列实现。下面通过一个具体例子说明三种深度优先遍历的访问顺序。假设一棵二叉树的结构为根结点 A其左孩子为 B右孩子为 CB 的左孩子为 D右孩子为 EC 的左孩子为 F。则前序遍历A → B → D → E → C → F中序遍历D → B → E → A → F → C后序遍历D → E → B → F → C → A层序遍历A → B → C → D → E → F二叉树的遍历通常使用递归算法实现代码简洁且易于理解。下面给出前序、中序、后序遍历的 Java 递归实现class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val val; } } public class BinaryTreeTraversal { // 前序遍历根 → 左 → 右 public void preOrder(TreeNode root) { if (root null) { return; } System.out.print(root.val ); preOrder(root.left); preOrder(root.right); } // 中序遍历左 → 根 → 右 public void inOrder(TreeNode root) { if (root null) { return; } inOrder(root.left); System.out.print(root.val ); inOrder(root.right); } // 后序遍历左 → 右 → 根 public void postOrder(TreeNode root) { if (root null) { return; } postOrder(root.left); postOrder(root.right); System.out.print(root.val ); } }三种遍历方式各有特点前序遍历常用于复制二叉树或输出树的镜像中序遍历在二叉搜索树中可以得到有序序列后序遍历常用于删除二叉树或计算子树规模3.二叉树的基本操作二叉树的基本操作主要包括统计节点个数、求叶子节点个数、求第 K 层节点个数、计算树的高度、查找指定值、层序遍历以及判断是否为完全二叉树等。下面逐一说明这些操作的接口定义与实现思路。3.1 获取树中节点的个数3.2 获取叶子节点的个数3.3 获取第 K 层节点的个数3.4 获取二叉树的高度3.5 检测值为 value 的元素是否存在。3.6 层序遍历3.7 判断一棵树是不是完全二叉树这些操作可以以下列的链接进行查看Java20261010/src/BinaryTreet.java · 若亦/代码仓库 - 码云 - 开源中国

相关新闻

Python 装饰器:我以为的语法糖,其实是定义时立刻执行的函数调用

Python 装饰器:我以为的语法糖,其实是定义时立刻执行的函数调用

这个坑我是被项目逼着学会的。 有一次产品要求给所有接口加耗时统计,我打开函数,开头写一行 start_time time.time(),return 前再写一行 print。改到第三个函数时我开始怀疑人生——同样的代码复制粘贴几十遍,以后改格式还得逐个…

2026/10/12 2:29:25 阅读更多 →
《信息论基础》第一章学习笔记

《信息论基础》第一章学习笔记

信息论来源:1948年香农发表论文《通信的数学理论》,在噪声信道中有效传输信息,对信息给予科学定量描述,创造性地采用概率论方法研究通信问题,给出信息定量描述,奠定经典信息论基础。1949年香农发表《噪声下…

2026/10/12 2:29:25 阅读更多 →
运动粘度仪与全自动低温乌氏粘度仪:原理、应用与选型

运动粘度仪与全自动低温乌氏粘度仪:原理、应用与选型

搞油品、高分子、绝缘油检测这一行的人,应该都有过这种经历:一排玻璃乌氏管泡在透明恒温油浴里,人蹲在边上掐着秒表,眼睛死死盯着液面流过上下刻度线,一整天下来眼睛都快花了。后来换了全自动运动粘度仪,从…

2026/10/12 2:29:25 阅读更多 →

最新新闻

PLC基本指令详解:从位逻辑到定时计数,掌握梯形图编程核心

PLC基本指令详解:从位逻辑到定时计数,掌握梯形图编程核心

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 3:19:56 阅读更多 →
柔性上料盘如何替代振动盘:从换型瓶颈到视觉引导的产线升级指南

柔性上料盘如何替代振动盘:从换型瓶颈到视觉引导的产线升级指南

简介:《全球与中国柔性上料盘市场现状及未来发展趋势(2024版)》是一份QYResearch出品的专业市场研究报告,面向柔性上料与自动化产线设备从业者、工业机器人厂商、市场分析师及投资研究人员。报告以2019至2023年为历史期、2024至20…

2026/10/12 3:19:56 阅读更多 →
WiFi分析工具设计实战:从数据采集到信道优化与故障排查

WiFi分析工具设计实战:从数据采集到信道优化与故障排查

1. 从一个标题说起:这个工具到底在解决什么问题第一次看到“Jev powered WiFi analysis tool”这个标题,我的直觉是:这大概率是一个把无线网络分析能力封装成轻量级工具的项目,名字里的“Jev”可能是作者自定的代号、模块名或者某…

2026/10/12 3:19:56 阅读更多 →
SpringBoot+Vue美食网站系统:前后端分离全栈项目架构与部署详解

SpringBoot+Vue美食网站系统:前后端分离全栈项目架构与部署详解

做个人项目这些年,前后端分离的练手项目做了不少,但每次有人让我推荐一个既能完整跑起来、又能覆盖主流开发流程的学习项目,我第一反应往往是这套美食网站系统。为什么?因为它的技术选型非常贴近当下中小型项目的真实组合&#xf…

2026/10/12 3:19:56 阅读更多 →
高斯赛德尔迭代法:大规模稀疏线性方程组的工程解法与实战技巧

高斯赛德尔迭代法:大规模稀疏线性方程组的工程解法与实战技巧

线性方程组这东西,刚接触数值计算的时候,总觉得不是事——高斯消元一把梭,n100也就是眨眨眼的事。可等你真在工程里碰到几十万未知量、矩阵非零元稀稀落落排成带状或块状的时候,直接法的“快”就变成了一种幻觉:要么内…

2026/10/12 3:19:56 阅读更多 →
attrs 比较机制完全指南:默认相等性、排序生成与自定义比较(Comparison)

attrs 比较机制完全指南:默认相等性、排序生成与自定义比较(Comparison)

后端 【免费下载链接】attrs Python Classes Without Boilerplate 项目地址: https://gitcode.com/gh_mirrors/at/attrs 点击查看 免费下载 本文围绕 attrs 官方文档 docs/comparison.md 展开,系统讲解 attrs 类实例的相等性(equality&#…

2026/10/12 3:18:56 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →