大话数据结构06—— 树

6.1 树的定义
  树(Tree)是 n(n0) 个结点的有限集。 n=0 时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当 n>1 时,其余结点可分为 m(m>0) 个互不相交的有限集 T1T2Tm ,其中每一个集合本身又是一个树,并且称为根的子树(SubTree)。
           
                大话数据结构06—— 树_第1张图片
             
           大话数据结构06—— 树_第2张图片
   需要强调两点:
 1、 n0 时根节点是唯一的。
 2、 m>0 时,子树的个数没有限制,但他们一定是互不相交的。

6.1.1 结点分类
  树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。
      大话数据结构06—— 树_第3张图片

6.1.2 结点间的关系
  结点的子树的根称为该结点的孩子(Child),该结点称为孩子的双亲(Parent)。同一个双亲的孩子之间互称兄弟(Sibling)。结点的祖先是从根到该结点所经分支上的所有结点。
  大话数据结构06—— 树_第4张图片

6.1.3 树的其他相关概念
  结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。双亲在同一层的结点互为堂兄弟。树中结点的最大层次称为树的深度(Depth)或高度。
   大话数据结构06—— 树_第5张图片
  如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。
  森林(Forest)是 m(m>0) 棵互不相交的树的集合。

6.1.4 树和线性结构的比较
   大话数据结构06—— 树_第6张图片

6.2 树的抽象数据类型
  
6.3 树的存储结构
6.3.1 双亲表示法
  每个结点中附设一个指示器指示其双亲结点在数组中的位置。
         这里写图片描述
  data是数据域,存储结点的数据信息。而parent是指针域,存储该节点的双亲在数组中的下标。
         大话数据结构06—— 树_第7张图片
             大话数据结构06—— 树_第8张图片        
  根据parent结点很容易找到双亲结点,时间复杂度为 O(1) ,直到parent为-1时,表示找到了树结点的根。如果想知道结点的孩子,则要增加一个结点最左边孩子的域,叫它长子域。如果没有孩子的结点,这个长子域就设置为-1。
           大话数据结构06—— 树_第9张图片
  对于有0个或一个孩子的结点来说,这样的结构是解决了要找结点孩子的问题了。甚至是有两个孩子,知道了长子是谁,另一个当然就是次子了。
  如果我们很关注各兄弟之间的关系,可以增加一个右兄弟域来体现兄弟关系。如果右兄弟不存在,则赋值为-1。
          大话数据结构06—— 树_第10张图片

  存储结构的设计是一个非常灵活的过程。一个存储结构设计的是否合理,取决于该存储结构的运算是否适合、是否方便,时间复杂度好不好等。
6.4.2 孩子表示法
  每个结点有多个指针域,其中每个指针指向一棵子树的根节点,我们把这种方法叫做多重链表表示法。
  

6.6 二叉树性质
  性质1:在二叉树的第 i 层上至多有 2i1 个结点。
  性质2:在深度为 k 的二叉树之多有 2k1 个结点。
  性质3:对任何一个二叉树T,如果其终端节点数为 n0 ,度为2的结点数为 n2 ,则 n0=n2+1
  性质4:具有n个结点的完全二叉树深度为[ log2n ]+1([x]表示不大于x的最大整数)。
  性质5:如果对一棵有n个结点的完全二叉树(其深度为[ log2n ]+1)的结点按层序编号(从第1层到底[ log2n ]+1层,每层从左到右),
  

6.7 二叉树的存储结构
6.7.1 二叉树顺序存储结构
  顺序存储结构一般只适用于完全二叉树。

6.8 遍历二叉树
6.8.1 二叉树遍历原理
  二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序一次访问二叉树中所有结点,使得每个节点被访问一次且仅被访问一次。
6.8.2 二叉树遍历方法
① 前序遍历
  若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,再前序遍历右子树。
  如下图,遍历顺序:ABDGHCEIF。
              大话数据结构06—— 树_第11张图片

② 中序遍历
  若二叉树为空,则空操作返回,否则从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树。
  如图,遍历顺序:GDHBAEICF。
            大话数据结构06—— 树_第12张图片

③ 后续遍历
  若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根节点。如图,遍历顺序为:GHDBIEFCA。
            大话数据结构06—— 树_第13张图片

④ 层序遍历
  若二叉树为空,则空操作返回,否则从树的第一层,也就是根节点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。如图,遍历顺序为:ABCDEFGHI
           大话数据结构06—— 树_第14张图片

6.8.3 前序遍历算法
  

你可能感兴趣的:(数据结构)