数据结构之树

本文详细介绍了数据结构中的树,包括树的定义、结点的度、根结点、叶结点等概念,并探讨了树的抽象数据类型及其操作,如初始化、销毁、插入、删除等。此外,文章还讨论了树的多种存储结构,如双亲表示法、孩子表示法、双亲孩子表示法和孩子兄弟表示法,以及它们的优缺点。同时,二叉树的特性、遍历方法和转换也被详细阐述,包括前序、中序、后序遍历以及如何将树和森林转换为二叉树。最后,文章提到了霍夫曼树及其带权路径长度的概念。
摘要由CSDN通过智能技术生成

树是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:1.有且仅有一个特定的称为根的结点2.当n>1时其余结点可分为m(m>0)个互不相交的有限集T1,T2。。。。。Tn 其中每一个集合本身又是一棵树,并且称为根的子树。


结点拥有的子树数称为结点的度,度为0的结点称为叶结点或终端结点;度不为0的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点,树的度是树内各结点的度的最大值。

                                ------A------

|     |

--------B -----C-----

| |   |

--------D-------        E          F

|       |       |       | 

G H I J

A为根节点    BCDE为内部结点      GHIJF为叶结点或终端结点

B结点度为1   C度为2     D结点度为3      J结点度为0


ABCDE  为分支结点或非终端结点


B是D的双亲    B是A的孩子     B和C互为兄弟

结点的层次从根开始 第一层 第二层 第三层 第四层

最大层次称为树的深度或高度  当前为4     

双亲在同一层的结点互为堂兄弟 例如I J


如果将树中结点的各子树看成从左到右是有次序的,不能互换的,则称该树是有序树,否则是无序树。


森林是m(m>=0) 棵互不相交的树的集合,对树中每个结点而言,其子树的集合即为森林。 例如 B结点及以下    和C及以下结点    那么B C 即森林



树的抽象数据类型

ADT 树(tree)

Data

树是由一个根节点和若干棵子树构成。树中结点具有相同数据类型及层次关系

Operation

InitTree(*T):构造空树T

DestroyTree(*T):销毁树T

CreateTree(*T,definition):按definition中给出树的定义来构造树

ClearTree(*T):若树T存在,则将树T清为空树。

TreeEmpty(T):若T树为空树,返回true,否则返回false

TreeDepth(T):返回T的深度

Root(T):返回T的根结点

Value(T,cur_e):cur_e是树T中的一个结点,返回此结点的值

Assign(T,cur_e,value):给树T的结点cur_e赋值为value

Parent(T,cur_e):若cur_e是树T的非根结点,则返回它的双亲,否则返回空。

LeftChild(T,cur_e):若cur_e是树T的非叶结点,则返回它的最左孩子,否则返回空。

RightSibling(T,cur_e):若cur_e有右兄弟,则返回它的右兄弟,否则返回空

InsertChild(*T,*p,i,c):其中p指向树T的某个结点,i为所指结点p的度加上1,非空树c与T不相交,操作结果为插入c为树T中p指结点的第i棵子树

DeleteChild(*T,*p,i):其中p指向树T的某个结点,i为所指结点p的度,操作结果为删除T中p所指结点的第i棵子树

endADT


树的存储结构

1.双亲表示法

在每个结点中,附设一个指示器指示其双亲结点到链表中的位置

data  parent

其中data是数据域,存储节点的数据信息,而parent是指针域,存储节点的双亲在数组中的下标

树的双亲表示法结点结构定义。

#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;


由于根结点是没有双亲的,所以我们约定根结点的位置域设置是-1.

下标 data parent

0 A -1

1 B 0

2 C 0

3 D 1

4 E 2

可以根据parent指针很容易找到双亲结点,所以O(1),如果是找结点的孩子,那就要遍历整个结构。

我们关注结点的双亲,结点孩子,结点兄弟。可以扩展双亲域,长子域,右兄弟域。

存储结构的设计是一个非常领过的过程,一个存储结构设计的是否合理,取决于基于该存储结构的运算是否适合,是否方便,时间复杂度好不好等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值