大话数据结构 第六章 树(一) 树的定义与结构
其他
2020-02-15 19:25:01
阅读次数: 0
树
定义
- 树是一种一对多的结构
- 树是n个结点的有限集。在任意一个非空树中:
- 【1】有且仅有一个特定的根结点;
- 【2】其余结点可以分为m个互不相交的有限集,其中每个集合本身又是一棵树,称为根的子树
结点分类
- 结点拥有的子树的数目称为结点的度,各结点的度的最大值被称为树的度
- 度为0的结点被称为叶结点或终端结点;度不为0的结点称为非终端结点或分支结点
- 结点的子树的根称为该节点的孩子,该结点称为孩子的双亲,同一个双亲的孩子之间互称兄弟
其他相关概念
- 层次:从根开始定义其,根为第一层,根的孩子为第二层,与双亲在同一层的结点互称堂兄弟。树中结点的最大层次称为数的深度或高度
- 森林是m棵互不相交的树的集合
树结构和线性结构的对比
树结构
- 根结点:无双亲,唯一;
- 叶节点:无孩子,可以多个;
- 中间结点:一个双亲多个孩子
线性结构
- 第一个数据元素:无前驱;
- 最后一个数据元素:无后继
- 中间元素:一个前驱一个后继
存储结构
双亲表示法
- 宗旨:除了根结点外,其余每个结点,它不一定有孩子,但是一定有且仅有一个双亲
- 以一组连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点在数组中的位置,结点结构为: data(数据域), parent(指针域)
- 可以很好的找到双亲,但是想知道孩子是什么,需要遍历整个结构
孩子表示法
- 多重链表表示法:每个结点有多个指针域,其中每个指针指向一棵子树的根结点。
- 方案【1】:按树的度分配空间。指针域的分数就等于树的度。当度相差很大时会造成空间的浪费
- 方案【2】:按需分配空间。每个结点指针域的个数等于该结点的度,专门取一个位置来存储结点指针域的个数,如:data,degree,child1,child2…由于结构不相同,在运算上会带来时间的损耗
- 孩子表示法:把每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则此链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中。有两种结点结构:
- 【1】孩子链表的孩子结点: child,next(指针域,存储指向某结点的下一个孩子结点的指针)
- 【2】表头数组的表头结点:data,firstchild(存储该结点的孩子链表的头指针)
- 查找孩子便利,但是查找双亲需要遍历整个结构
- 改进:孩子双亲表示法
孩子兄弟表示法
- 任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。
- 结点结构:data,firstchild,rightsib
- 中心思想是把一棵复杂的树变成一棵二叉树
发布了59 篇原创文章 ·
获赞 3 ·
访问量 1803
转载自blog.csdn.net/Felix_hyfy/article/details/99216473