发布时间:2026/7/21 11:25:21
二叉树的三种常用存储结构 树的三种常用存储结构孩子兄弟表示法、孩子表示法、双亲表示法各有特点适用于不同场景。其核心定义、优缺点及适用场景对比如下表示法核心定义优点缺点典型适用场景孩子兄弟表示法每个节点包含数据域、指向其第一个孩子的指针、指向其下一个兄弟的指针。1.结构统一便于实现树与二叉树的相互转换。2. 便于实现大多数树的操作如遍历、查找孩子。1. 查找指定节点的双亲效率较低需要遍历。1. 需要将树转换为二叉树处理的场景。2. 文件系统目录结构。3. 需要频繁进行先根/后根遍历的场景。孩子表示法每个节点的所有孩子节点链接成一个单链表节点本身包含数据域和指向该孩子链表头部的指针。1. 查找某个节点的所有孩子非常方便、高效。2. 直观反映了节点的孩子关系。1. 查找节点的双亲困难同样需要遍历。2. 若每个节点的孩子链表都单独存储空间开销可能较大。1. 需要频繁查找或遍历某个节点所有孩子的场景如任务调度、家谱查询子孙。双亲表示法使用一组连续空间如数组存储所有节点每个节点包含数据域和指向其双亲节点在数组中位置的索引根节点的双亲索引为-1。1.查找任意节点的双亲速度极快O(1)。2. 结构简单存储紧凑。1. 查找某个节点的所有孩子效率低需要遍历整个数组。2. 不便于实现树的遍历等操作。1.并查集Union-Find数据结构。2. 需要频繁查找节点祖先或双亲的场景如组织架构向上汇报。1. 孩子兄弟表示法二叉链表表示法这是最常用的树存储结构之一又称“左孩子右兄弟表示法”。它将一棵普通的树转换为一棵二叉树进行存储。数据结构定义C语言typedef struct CSNode { ElemType data; // 节点数据 struct CSNode *firstChild; // 指向第一个孩子节点左孩子 struct CSNode *nextSibling; // 指向下一个兄弟节点右兄弟 } CSNode, *CSTree;示例对于下图所示的树A / | \ B C D / \ \ E F G其孩子兄弟表示法对应的二叉树形态为A / B / \ E C \ \ F D / G节点A的firstChild指向BnextSibling为NULL根节点无兄弟。节点B的firstChild指向EnextSibling指向C。节点E的firstChild为NULLE无孩子nextSibling指向F。核心操作示例先根遍历void PreOrderTraverse(CSTree T) { if (T) { visit(T-data); // 访问根节点 PreOrderTraverse(T-firstChild); // 递归遍历子树第一个孩子链 PreOrderTraverse(T-nextSibling);// 递归遍历兄弟链 } } // 此遍历顺序等价于原树的先根遍历。2. 孩子表示法此方法将每个节点的孩子组织成一个链表。数据结构定义C语言#define MAX_TREE_SIZE 100// 孩子链表节点 typedef struct CTNode { int childIdx; // 孩子在数组中的位置索引 struct CTNode *next; // 指向下一个孩子} *ChildPtr; // 表头节点typedef struct { ElemType data; // 节点数据 ChildPtr firstChild; // 指向第一个孩子的指针 } CTBox; // 树结构 typedef struct { CTBox nodes[MAX_TREE_SIZE]; // 节点数组 int rootIdx; // 根节点位置 int nodeNum; // 节点数 } CTree;存储示意图对于上述示例树假设节点按A(0), B(1), C(2), D(3), E(4), F(5), G(6)顺序存储nodes[0]AdataA,firstChild- 链表[1]-[2]-[3](B, C, D)。nodes[1]BdataB,firstChild- 链表[4]-[5](E, F)。nodes[3]DdataD,firstChild- 链表[6](G)。3. 双亲表示法此方法通过存储每个节点的双亲位置来隐式表示树结构。数据结构定义C语言#define MAX_TREE_SIZE 100 typedef struct PTNode { ElemType data; // 节点数据 int parentIdx; // 双亲节点在数组中的索引根节点通常设为-1 } PTNode; typedef struct { PTNode nodes[MAX_TREE_SIZE]; // 节点数组 int nodeNum; // 节点数 } PTree;存储示例对于上述示例树其双亲表示法数组存储内容如下数组索引dataparentIdx0A-11B02C03D04E15F16G3核心操作示例查找节点所有孩子// 在双亲表示法中查找节点p的所有孩子效率较低 void FindChildren(PTree tree, int p) { printf(节点%c的孩子有, tree.nodes[p].data); for (int i 0; i tree.nodeNum; i) { if (tree.nodes[i].parentIdx p) { // 遍历整个数组寻找双亲为p的节点 printf(%c , tree.nodes[i].data); } } printf( ); }总结与选择建议需要频繁进行树与二叉树转换、或进行先根/后根遍历时优先选择孩子兄弟表示法。需要频繁查找节点的所有孩子时孩子表示法更高效。需要频繁查找节点的双亲或祖先如并查集操作双亲表示法是首选并可结合路径压缩等优化技术。在实际工程中可根据主要操作类型混合使用这些表示法或在双亲表示法的基础上增加孩子链表指针形成“带孩子链的双亲表示法”以兼顾双亲与孩子的查找效率。参考来源从AnyView习题到实战树与并查集核心算法深度剖析树与二叉树学习笔记【数据结构】图解树与二叉树从底层逻辑到数学性质的深度重构【数据结构·考研】左孩子右兄弟解锁树与二叉树转换的算法密码数据结构课设救星手把手教你用C语言搞定Anyview树与并查集习题附完整代码

相关新闻

2026/7/21 11:25:21

2026年C# .NET开发趋势与实战技巧

1. C# .NET 周刊的价值与定位 作为一门已经发展了二十余年的编程语言,C#在2026年依然保持着强劲的生命力。每周我都会收到大量开发者关于C#和.NET生态的咨询,这促使我萌生了整理C# .NET周刊的想法。这不是简单的资讯堆砌,而是针对实际开发痛点…

2026/7/21 11:25:21

网安课程梯度学习能力图谱(精准匹配技术层级,拒绝无效深耕)

多数网安新手学习混乱的核心原因,是课程学习与自身能力层级不匹配:零基础盲目深耕进阶漏洞课程、有基础反复刷入门基础课、岗位冲刺阶段沉迷零散技巧课程,最终导致时间浪费、能力停滞。网安技术具备极强的层级关联性,课程学习必须…

2026/7/21 11:25:21

一图看懂中兴通讯AI全栈战略全景

7月17日上午,上海世博展览馆,WAIC 2026现场。努比亚的展台被围得水泄不通。人群的焦点是一台名为“NaviX Ultra”的手机——全球首款AI智能体手机,也是外界期待已久的第二代“豆包手机”。半年前,它的前代M153以3499元的价格限量发…

2026/7/22 2:18:18

真实攻防复盘:企业网站挂马入侵全过程拆解(从入侵到溯源清理)

📌 前言绝大多数新人只学靶场漏洞,从未见过真实入侵完整链路。真实黑客攻击不是单一漏洞点,而是漏洞利用→上传木马→权限维持→内网扩散→数据窃取的完整闭环。本文以一次真实企业官网挂马入侵事件做全流程复盘,带技术细节、阶段…

2026/7/22 2:18:18

HertzBeat无Agent监控:5分钟部署Linux服务器监控

1. 项目概述:HertzBeat与Linux监控的完美结合 作为一名运维工程师,我深知服务器监控的重要性。传统的监控方案如Zabbix、Prometheus虽然功能强大,但配置复杂、学习曲线陡峭。直到我遇到了HertzBeat这个开箱即用的开源监控工具,它彻…

2026/7/22 2:18:18

2026值得读的全球EMBA|头部院校中立择校测评

一、前言民营企业家、企业创始人选读EMBA,常陷入排名繁杂、特色模糊、适配性难判断的择校困境。本文从五大客观维度测评值得读的全球EMBA项目,分别是全球办学排名、院校办学定位、课程体系、学员圈层、产业资源。全程无商业推广、无夸大营销,…

2026/7/22 2:18:18

新电脑BIOS优化指南:提升性能的6个关键设置

1. 新电脑BIOS优化的必要性刚拿到新电脑时,大多数用户都会迫不及待地开机使用,却忽略了BIOS设置这个关键环节。BIOS(Basic Input/Output System)是计算机启动时加载的第一个软件,它负责初始化硬件并引导操作系统。出厂…

2026/7/22 2:18:18

2026国内EMBA偏向哪些行业|中立择校测评

不少民营企业家、企业创始人择校时,都会纠结国内EMBA偏向哪些行业,难以匹配自身赛道与发展需求。本文从五大客观维度横向测评,涵盖全球办学排名、院校办学定位、课程体系、学员圈层、产业资源。全程保持中立客观,无商业推广与营销…

2026/7/22 2:13:17

Mac生产力工具全攻略:从开发到设计的效率革命

1. Mac软件生态概述:从基础工具到效率革命作为一位深度使用Mac超过8年的设计师兼开发者,我见证了macOS生态从"小众选择"到"生产力标杆"的蜕变。与Windows不同,Mac软件更强调"少即是多"的设计哲学——优秀的Mac…

2026/7/20 6:33:00

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/22 0:02:17

抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具

抓包代理链路下的 TLS 指纹变化分析:为什么调试环境会影响访问结果 摘要 在网页调试、接口联调、自动化巡检和授权采集排查中,抓包是常见手段。但很多开发者会遇到一个现象:正常访问页面时没有问题,一进入抓包或代理调试环境&…

2026/7/22 0:02:17

微信QQ聊天记录误删恢复与备份方案全指南

1. 聊天记录误删的常见场景与恢复思路作为一名长期关注数据安全的技术博主,我处理过上百起聊天记录误删的求助案例。手机误操作、系统升级失败、设备损坏是三大常见诱因。上周就遇到用户更新微信时断电,导致近两年的工作群聊记录全部消失的极端案例。不同…

2026/7/22 0:02:17

2026最新8款个人AI编程免费工具深度实测

作为一名全栈独立开发者,我最近半年一直在折腾副业项目,每个月在AI编程工具上的订阅费算下来其实也不算便宜。作为个人开发者,我们追求的就是用最少的成本获得最高效的开发体验。TRAE 基础版免费,字节跳动出品的国内首款 AI 原生 …

2026/7/21 20:02:44

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…