目录
1.4 树在实际中是怎样运用的?(表示文件系统的目录树结构)
在数据结构中,有线性的数据结构。比如耳熟能详的数组、链表等都是线性的数据结构。那有没有不是线性的呢?当然有,本文要介绍的就是数据结构中一种非线性的数据结构 --- 树
1. 树的概念及其结构
1.1 树的概念
树是一种非线性的数据结构 ,它由n(n>=0)个有限节点组成一个有层次关系的集合。把它叫做树是因为它很想一颗倒挂的树,也就是说树的根朝上,而叶子朝下的。
有一个特殊的节点,称为根节点,根节点没有前驱节点 |
其余节点被分成M(M>0)个互不相交的集合T1,T2,T3.......TM-1,TM。其中每一个集合Ti(1<=i<=M)又是一颗结构与树类似的子树。每个子树有且只有一个前驱节点,可以有0个或多个后驱节点。 |
因此树是递归定义的。 |
1.2 树的相关概念
节点的度:一个节点含有的子树个数称为该节点的度。 如上图,A的度为6。
叶节点或终端节点:度为0的节点称为叶节点。 如上图,B,C,H,I,P,Q就是叶节点
非终端节点或者分支节点:度不为0的节点。 如上图,D,E,J,F,G就是分支节点
双亲节点或父节点:若一个节点含有子节点,那这个节点称为其子节点的父节点。 如上图:A是B的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为子节点。 如上图:B是A的子节点
兄弟节点:具有相同父节点的节点称为兄弟节点。 如上图:P是Q的兄弟节点
树的度:一棵树中最大的节点的度就是树的度。 如上图:树的度是6
节点的层次:从根节点开始定义起,根为第一层,根的子节点为第二层,以此类推
节点的高度或深度:树中节点的最大层次。 如上图:树的深度是4
堂兄弟节点:双亲在同一层的节点互为堂兄弟。 如上图:H和N是堂兄弟结点
节点的祖先:从根到该节点所经分支的所有结点。 如上图:A是所有节点的祖先
子孙:以某节点为根的子树中的任意一个节点都被称为该节点的子孙 如上图:所有节点都是A的子孙
森林:由M棵(M>0)互不相交的树的集合叫做森林。
1.3 树的结构
树的结构相较线性表就复杂多了,要存储起来比较麻烦,既要保存值域,也要保存节点之间的关系。在实际运用中有很多表示法,比如双亲表示法,孩子表示法,孩子双亲表示法以及孩子兄弟表示法。最常用的是孩子兄弟表示法
//树的结构
typedef char BTDataType;
typedef struct TreeNode {
BTDataType data;//节点中的数据域
struct TreeNode* FirstChild;//指向该节点的第一个孩子节点
struct TreeNode* pNextBrother;//指向其下一个兄弟节点
}TreeNode;