大话数据结构 第六章 树(一) 树的定义与结构

定义

  • 树是一种一对多的结构
  • 树是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