树的存储结构

一、树和森林的概念

树:是n(n>=0)个结点的有限集合。若n=0,称为空树。若n>0,则有且仅有一个特定的称为根Root的结点;其余结点可分为m(m>=0)个互不相交的有限集T1,T2,...,Tm;
森林:m(m>=0)棵互不相交的树的集合。

二、树的存储结构

1.双亲表示法

  • 实现:定义结构数组。存放树的结点,每个结点含有两个域:

    • 数据域:存放结点本身信息。
    • 双亲域:指示本结点的双亲结点在数组中的位置。
  • 特点:找双亲容易,找孩子难。

  • C语言的类型描述

//结点的定义
typedef struct PTNode{
TElemType data;
int parent;
}PTNode;
// 树的结构
# define MAX_TREE_SIZE 100 //定义数组长度
typedef struct {
PTNode nodes[MAX_TREE_SIZE];//定义结点类型的数组用来存放结点
int r,n;//根节点的位置和结点个数
}PTree;

2.孩子链表

  • 定义:把每个结点的孩子结点排列起来,看成是一个线性表,用单链表存储,则n个结点有n个孩子链表(叶子结点的孩子链表为空表)。而n个头指针又组成一个线性表,用顺序表(含有n个元素的结构数组)存储。
  • C语言的类型描述
//孩子节点结构
typedef struct CTNode{
int child;
struct CTNode *next;
}*ChildPtr;
//双亲结点结构
typedef struct{
TElemType data;
ChildPtr firstchild;//孩子链表头指针
}CTBox;
//树结构
typedef struct{
CTBox nodes[MAX_TREE_SIZE];
int r,n;
}CTree;
  • 特点:找孩子容易,找双亲难。
  • 带双亲的孩子链表:方便查找双亲,双亲结点中再增加一个数据域用来存放该结点的双亲位置

3.孩子兄弟表示法

孩子兄弟表示法又称为二叉树表示法或二叉链表表示法。

  • 实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点。
  • C语言表示
typedef struct CSNode{
ElemType data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;

posted @   梁伯熹  阅读(308)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示