为了便于以后的学习与查询,所以有了这篇博客。博客内容参考《大话数据结构》——程杰。如有侵权,请联系删除。

1.树的定义

树(Tree) 是n个结点的有限集。n=0时称为空树。在任意一颗非空树中:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m个互不相交的有限集,其中每一个集合本身又是一颗树,并且称为根的子树(SubTree)。如下图所示

Syntax error in textmermaid version 11.4.1

2.树的存储结构

2.1双亲表示法

//树的双亲表示法结点结构定义
#define MAX_TREE_SIZE 100
typedef int TElemType; //树结点的数据类型,暂定为整型
typedef struct PTNode //结点结构
{
	TElemType data; //结点数据
	int parent;  	//双亲位置
} PTNode;

typedef struct
{
	PTNode nodes[MAX_TREE_SIZE]; //结点数组
	int r,n;					//根的位置和结点数
}PTree;

2.2孩子表示法

  • 把每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中
/* 树的孩子表示法结构定义 */ 
#define MAX_TREE_SIZE 100
/* 孩子结点 */ 
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;

2.3 孩子兄弟表示法

  • 我们观察后发现,任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。
/* 树的孩子兄弟表示法结构定义 */ 
typedef struct CSNode 
{     
	TElemType data;     
	struct CSNode *firstchild, *rightsib; 
} CSNode, *CSTree; 
  • 对于图1的树来说,这种方法的示意图如图2所示

  • 这个表示法的最大好处就是它把一颗复杂的树变成了一棵二叉树。

posted @   Wang_h_f  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示