数据结构与算法(五)树和二叉树

本文深入探讨了树的定义、结点分类及其关系,包括根结点、子树、度、叶结点等概念。进一步讨论了树的存储结构,如双亲表示法、孩子表示法和孩子兄弟表示法。接着,文章详细阐述了二叉树的特性,包括斜树、满二叉树和完全二叉树,并介绍了二叉树的遍历方法,如前序、中序、后序和层序遍历。

一、树的定义及相关术语
  树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树当中:有且仅有一个特定的称为根(Root)的结点;当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、……、Tm,其中每一个集合本身又是一颗树,并且称为根的子树(SubTree)。
  对于树的定义还需要需要强调的是:n>0时根结点是唯一的,不可能存在多个根结点,不要和现实生活中的大树混合在一起,现实生活中的树有很多的根须,那是真实的树,数据结构中的树只能有一个根结点;m>0时,子树的个数没有限制,但是它们一定是互不相交的。
  在这里插入图片描述
  在这里插入图片描述
树的结点分类
  树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第n层,则其子树的根就在第n+1层;其双亲在同一层的结点互为堂兄弟。树中结点的最大层次称为树的深度(Depth)或高度,当前树的深度为4。如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。
  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述
树的结点间的关系:
  结点的子树的根称为该结点的孩子(Child),相应地,该结点称为孩子的双亲(Parent)。对于结点来说其父母同体,唯一的一个,所以只能把它称为双亲了。同一个双亲的孩子之间互称兄弟(Sibling)。结点的祖先是从根到该结点所经分支上的所有结点。在图中,对于H来说,D、B、A都是它的祖先,反之,以某结点为根的子树中的任一结点都称为该结点的子孙,B的子孙有D、G、H、I。
  在这里插入图片描述
二、树的存储结构
  双亲表示法:我们假设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点在数组中的位置;也就是说,每个结点除了知道自己是谁以外,还知道它的双亲在哪里;其中data是数据域,存储结点的数据信息;而parent是指针域,存储该结点的双亲在数组中的下标。
  在这里插入图片描述
  孩子表示法:具体办法是,把每个结点的孩子结点排列起来,以单链表作为存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放一个一维数组中。为此,设计两种结点结构,一个是孩子链表的孩子结点,其中child是数据域,用来存储某个结点在表头数组中的下标,next是指针域,用来存储指向某结点的下一个孩子结点的指针;另一个是表头数组的表头结点,其中data是数据域,存储某结点的数据信息,firstchild是头指针域,存储该结点的孩子链表的头指针。
  在这里插入图片描述
  孩子兄弟表示法:任意一颗树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的;因此,我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟;其中data是数据域,firstchild为指针域,存储该结点的第一个孩子结点的存储地址,rightsib是指针域,存储该结点的右兄弟结点的存储地址。
  在这里插入图片描述

三、二叉树定义与特点
  二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
  二叉树的特点有:
    1)每个节点最多有两棵子树,所以二叉树中不存在度大于2的结点,注意不是只有两颗子
     树,而是最多有,没有子树或者有一棵子树都是可以的;
    2)左子树和右子树是有顺序的,次序不能任意颠倒;
    3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树;
  
  在这里插入图片描述
  
  二叉树具有五种基本形态:
    1)空二叉树;
    2)只有一个根结点;
    3)根结点只有左子树
    4)根结点只有右子树;
    5)根结点既有左子树又有右子树;
    在这里插入图片描述

四、特殊的二叉树
  斜树:顾名思义,斜树一定是要斜的,但是往哪里斜还是有讲究的;所有的结点都只有左子树的二叉树叫左斜树;所有结点都是只有右子树的二叉树叫右斜树,这两者统称为斜树;斜树有很明显的特点,就是每一层都只有一个结点,结点的个数与二叉树的深度相同。
  在这里插入图片描述
  满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树就称为满二叉树,因为单是每个结点都存在左右子树,不能算是满二叉树,还必须要所有的叶子都在同一层上,这样就做到了整棵树的平衡;
  满二叉树的特点
    1)叶子只能出现在最下一层,出现在其他层就不可能达成平衡;
    2)非叶子结点的度一定是2,否则就是“去胳膊少腿”了;
    3)在同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多;
    在这里插入图片描述
  完全二叉树:对一棵具有n个结点的二叉树按层序进行编号,如果编号为i(i<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树;
  完全二叉树的特点
    1)叶子结点只能出现在最下两层;
    2)最下层的叶子一定集中在左部连续位置;
    3)倒数第二层,若有叶子结点,一定都在右部连续位置;
    4)如果结点度为1,则该结点只有左子树,即不存在只有右子树的情况;
    5)同样结点数的二叉树,完全二叉树的深度最小;
   在这里插入图片描述

五、二叉树的存储结构
  二叉树的顺序存储结构:二叉树的顺序存储结构就是用一堆数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系,比如双亲与孩子关系,左右兄弟的关系等。
  在这里插入图片描述
  二叉链表:二叉树的顺序存储结构虽然简单,但是适用性并不强,我们就要考虑链式存储结构,二叉树的每个结点最多有两个孩子,所以为它设计了一个数据域和两个指针域是比较自然的想法,我们称这样的链表叫做二叉链表;其中data是数据域,lchild和rchild都是指针域,分别存放指向左孩子和右孩子的指针。
  在这里插入图片描述

六、二叉树的遍历
  二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次;
  前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树;
  中序遍历:规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树;
  后序遍历:规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点;

  层序遍历:规则是若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按照从左到右的顺序对结点逐个访问;
  在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值