树的概念:
树是一种非线性的数据结构,它由n(n可以为0)个有限的节点组成一个具有层次关系的结合。之所以把它称之为树是因为它的逻辑结构形似一个倒着的树。它的根在上面,叶子在下面。
有一个特殊的节点,被称为根节点,它是一个树的最起始位置。
除根节点外,其余节点配分成M个互不相交的集合,其中的每一个集合又是一个结构与数类似的子树。每颗子树的根节点都有且仅有一个父节点,可以有0个或多个子节点。
树是递归定义的。
在树形结构中,子树之间不能有交集,不然就不是树形结构。
除了根节点之外,每个节点有且仅有一个父节点。一棵有N个节点的树有N-1条边,实际上在树形结构中并不关注边这个概念,他注重的是节点。注重边的是另一个结构——图。
树形结构中的一些名词:
节点的度:一个节点含有子树的个数称为该节点的度;
叶节点/终端节点(常被叫做叶子):度为0的节点称为叶节点,也就是没有子节点;
非终端节点/分支节点:度为0的节点,有子节点;
双亲节点/父节点:若一个节点含有的子节点,则称这个节点为其子节点的父节点;
兄弟节点:具有相同父节点的节点互称为兄弟节点;
树的度:一棵树中,最大的节点的度就是这棵树的度;
节点的层次:从根开始定义,根为第1层,根的子节点为第2层,以此类推。为什么不是从0 开始?0被用来表示空树;
树的高度/深度:树中节点的最大层次,即有几层节点就有多少高度;
堂兄弟节点:双亲在同一层的节点互为堂兄弟节点;
节点的祖先:从根到该节点所经分支上的所有节点;
子孙:以某节点为根的子树中任一节点都称为该节点的子孙;
森林:有n棵互不相交的树组成的集合称为森林;Windows操作系统就是个森林,Linux是一棵树。
可以参照族谱来理解树形结构。
树的表示:
树结构相对线性表就复杂多了,要存储表示会非常的麻烦。既要保存值域,又要保存节点和节点之间的关系。实际上数有多种表示方式,比如:双亲表示法,孩子表示法,孩子双亲表示法以及孩子兄弟表示法等。但是真正使用的是孩子兄弟表示法。因为它足够简单足够厉害。
typedef int DataType; struct Node { struct Node* child; struct Node* brother; };
通过上图我们可以发现,孩子兄弟法通过巧妙的方式把兄弟节点建立了联系,这样我们对任何一个节点都能采用相同的结构体来实现了,无非就是值、子节点指针、兄弟姐弟指针,哪个没有就指向空就行了。也不知道是哪位天才想出来的,简直厉害。我感觉这在一定程度上还是参考了族谱的。