大话数据结构--初始树

340 阅读4分钟

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」。

前言

废话不多,数据结构必须学! 每天更新一章,一篇写不完的话会分成两篇来写~

资料获取

image.png

六、树

6.1 树的定义

树(Tree)是n (n≥0)个结点的有限集。n=0时称为空树。 在任意一棵非空,树中:

(1) 有且仅有一个特定的称为根(Root) 的结点;

(2) 当n>1时,其余结点可分为m (m>0)个互不相交的有限集T1、 T2、.... Tn, 其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

image-20211114171457755

树的定义其实就是我们在讲解栈时提到的递归的方法。也就是在树的定义之中还用到了栈的概念,这是一种比较新的定义方法。下图中的子树T1和子树T2就是根结点A的子树。当然,D、G、H、I组成的树又是B为结点的子树,E、J组成的树是C为结点的子树。

image-20211114171609100

对于树的定义还需要强调两点:

  1. n>0时根结点是唯一的,不可能存在多个根结点,别和现实中的大树混在一起,现实中的树有很多根须,那是真实的树,数据结构中的树是只能有一个根结点。
  2. m>0时,子树的个数没有限制,但它们一定是 互不相交的。像下面的两个结构就不符合树的定义,因为它们都有相交的子树。

下面这张图就是不符合要求的树定义

image-20211114171805464

6.1.1基本术语

根节点:非空树中无前驱结点的结点

结点的度:结点拥有的子树数

树的度:树内各节点的度的最大值

叶子:度为0,没有分支了,也叫终端结点

分支结点:度不为0的点,根结点以外的分支结点称为内部结点

除了根结点以外,其他的结点都称为内部结点

image-20211114172030949

6.1.2结点间的关系

结点的子树的根称为该结点的孩子(Child),相应地,该结点称为孩子的双亲(Parent)。

为啥叫双亲呢?因为就一个结点,对结点来说其父母同体所以只能把它称为双亲

同一个双亲的孩子之间互称兄弟(Sibling)。结点的祖先是从根到该结点所经分支上的所有结点。所以对于H来说,D、B、A都是它的祖先。反之,以某结点为根的子树中的任一结点都称为该结点的子孙。B的子孙有D、G、H、I

image-20211114172756533

6.1.3树的其他相关概念

结点的层次(Level) 从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第1层,则其子树的根就在第l+1层。其双亲在同一层的结点互为堂兄弟。 图中D、E、F是堂兄弟,而G、H、I、J也是。

树中结点的最大层次称为树的深度(Depth) 或高度,当前树的深度为4。

image-20211114173045720

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

森林(Forest) 是m (m≥0)棵互不相交的树的集合

把根节点删除,树就变成了森林

两棵子树其实就可以理解为森林。

给森林中的各子树加上一个双亲结点,森林就变成了树

image-20211114171457755

对比线性表与树的结构,它们有很大的不同

线性结构

第一个数据元素:无前驱

中间元素:一个前驱一 个后继

最后一个数据元素:无后继

树结构

根结点:无双亲,唯一

叶结点:无孩子,可以多个

中间结点:一个双亲多个孩子

6.2树的抽象数据类型

 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,
     非空树cT不相交,操作结果为插入C为树Tp指结点的第i棵子树。
     DeleteChild (*T,*p,i) :其中p指向树T的某个结点,i为所指结点p的度,操作
     结果为删除TP所指结点的第i棵子树。
 endADT