1.3.1 树与二叉树

这篇具有很好参考价值的文章主要介绍了1.3.1 树与二叉树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.3.1 树与二叉树

树是非线性结构。具体来说,树是层次结构。日常社会中,层次关系非常普遍,例如,家组谱系,组织机构关系等都是呈现一种层次结构。

1.3.1 树的基本概念

树T是n(n>0)个结点组成的有限集,其中有一个特定的结点R称为T的根,其余结点划分为不相交的子集T1,T2…,Tn。每个子集都是树,称为T的子树。每颗子树的根R1,R2,…Rm称为R的子结点或孩子,R称为R1,R2,‘’‘’‘’‘,Rm.的父亲结点或者双清,R1,R2,…,Rm互称为兄弟结点。树中每一个结点V的子结点个数M称为V的度,度为0的结点称为叶结点,度大于0的结点称为分支结点。

​ 树的定义是一个递归的定义,这是树的固有特性决定的,树结构本身就是一个递归的结构。树的很多应用中都采用递归过程来实现。

1.3.2二叉树

二叉树是一种重要的树形结构,应用面广也是考试中经常出现的考点。

1.二叉树的应以及其主要特性

一颗二叉树T是n(n≥0)个结点组成的有限集,这个集合或为空,或由一个根结点R及两颗不相交的二叉树T1,T2组成T1,T2分别称为T的左子树和右子树,T1,T2的根R1,R2分别称为R的左子结点和右子结点。

二叉树中每个结点的度不大于2.二叉树中左子树与右子树的次序不能颠倒,但都可以存在或者为空,不同的存在状态可以组合称二叉树的5种基本形态,即两颗子树均为空或不为空,或者一颗为空,而另一颗不为空,还有空树。这5种形态。

2.二叉树的顺序存储结构和链式存储结构

1)二叉树的顺序存储结构

若V不是树根,则V的父结点保存在A[(i-1)/2]中

2)二叉树的链式存储结构

采用二叉链表保存二叉树T时,每个结点的结构为

lchild data rchild

其中data保存当前结点的值,lchild和rchild分别为指向当前左子结点和右子结点的指针。

typedef struct BinNode{     //二叉树结点类
    ElemType  data ;        //该结点的值
    struct BinNode * lchild; //指向左孩子结点的指针
    struct BinNode * rchild  //指向右孩子结点的指针
}

采用二叉链表保存二叉树T时,叶结点的两个指针域皆为NULL.。对于含n个结点的二叉树T,二叉树表中共有n-1个非空指针域,有n+1个空指针域。

静态链表保存在一堆数组中,数组单元包含三个域;lchild, data 和rchild。

在二叉链表中,查找某个结点的子结点非常方便,但不易查找父结点。为此,为每个结点增加一个指向父结点的指针域,结构定义为

lchild data parent rchild

由此得到三叉链表。根结点的parent域为Null。

三叉链表也可以采用静态链表结构

静态链表保存在一堆数组中,数组单元包含四个域:

lchild parent data rchild

其中data保存二叉树中结点的信息,lchild和rchild分别保存其左子几点及右子结点在数组下标,parent保存结点的父结点在数组中的下标。

3.二叉树的遍历

二叉树的遍历共有4种:先序遍历,中序遍历,后序遍历及层序遍历。

1)先序遍历

先序遍历又称为先根遍历或者前序遍历,过程如下;

如果二叉树T为空则返回,否则

  1. 访问根结点;

  2. 先序遍历T的左子树;

  3. 先序遍历T 的右子树。

    2)中序遍历

    中序遍历又称中根遍历,过程如下;

    如果二叉树T为空则返回,否则

    1. 中序遍历T的左子树;

    2. 访问根结点;

    3. 中序遍历T的右子树;

      3)后序遍历

      后序遍历又称为后根遍历,过程如下;

      如果二叉树T为空则返回,否则

      1. 后序遍历T的左子树;

      2. 后续遍历T的右子树;

      3. 访问根结点。

        给定二叉树的中序遍历序列,再加先序或后序遍历序列,可唯一确定二叉树,可以验证,仅给出一种遍历序列时,不能唯一确定二叉树。仅给出二叉树的先序遍历及后序遍历序列,也不能唯一确定二叉树。

        二叉树的先序遍历,中序遍历及后序遍历即可使用递归方法实现,也可适合非递归方式实现。

        4)层序遍历

        层序遍历的过程如下:

      二叉树T的根结点入队列;
      当队列不空时
      {
      出队列,并输出元素e;
      若e有左子结点l,则l入队列;
      若e有右子结点r,则r入队列;
      }
      

      在层序遍历中,二叉树中的任意两个结点Ui 和Uj,若Ui先于Uj被遍历到,则Ui的子结点先于Uj的子结点被遍历到。

      4.线索二叉树的基本概念和构造

      二叉树的遍历结果得到结点的一个线性序列,在这个序列中,除第一个和最后一个结点外,每个结点都有一个且仅有一个前驱,有一个且仅有一个后继。遍历的过程就是不断寻找结点后继的过程。

      可以利用二叉链表中存在的空指针域指向结点的前驱和后继,得到线索树。对于树中的一个具体结点来说,不同的遍历序列中,它的前驱可能是不同的,后继也可能是不同的。因此,线索树又分为先序线索树,中序线索书及后序线索树。以中序线索树为例,线索树中结点的定义为

      lchild iTag data rTag rchild

​ iTag ={ 0, lchild域指向结点的左孩子结点

​ 1, lchild域指向结点的中序遍历前驱}

​ rTag = { 0, rchld 域指向结点的右孩子结点。

  1. rchild域指向结点的中序遍历后继}

    在中序线索树种寻找结点v 的后序结点时,有以下集中情况;

    (1)若V,rTag = =1 且 V,rchild! = NULL,则v,rchild指向的结点即为V的后续结点。

    (2)若V,rTag = = 1 且 V,rvhild = = NuLL,则v为中序序列的最后一个结点,无后继结点。

    (3)若V, rTag = = 0 且 V,rchild! = NuLL,则v的右子树中序遍历的第一个结点为V 的后继;

    (4)若v,rTag = = 0 且 v,rchild = = NULL,无此种情况出现。

    那么,情况(3)中,右子树中序遍历序列的第一个结点是哪个呢?从右子树的根开始沿 lchild指针向下,找到lchild == NuLL的结点即是。在建立线索树之前,这个空指针还没有指向它的前驱。若已经建立了线索树,则找到V,Ltag = = 1 的结点即是。

    1.3.3树,森林

    1.树的存储结构

    1. 父结点表示法

      父结点表示法有静态实现及动态实现两种。

      静态实现父亲结点表示法时,使用一堆数组保存相关信息。数组的每个单元包括两个域,分别是数据域data及父结点域parent,data域保存结点的信息,parent保存该结点的父节点在数组下标。树根结点的父结点域中保存-1,这是树中唯一没有父结点的结点。多棵树可以同时保存在一个数组中。检查数组中parent域为-1的结点,可知数组保存的树的个数。

      动态实现父结点表示法时,树中结点的定义为

      data parent

      其中data保存树中结点信息,parent保存指向父结点的指针。

      根结点的parent域为NULL,这是树中唯一的一个空指针。

      2.孩子结点表示法

      树中每个结点的子结点个数差别个数差别可能很大,为了适应每个结点可以有不同数目的子结点的情况,可以使用链表保存子节点的情况。每个结点v1的所有子结点组成一个单链表L,这些链表的表头指针保存在一个数组中。

      3.左孩子右孩子表示法

      使用与二叉链表类似的一种结构,每个结点的结构为

      fchlid data nsibling

      其中,data域保存结点的信息,fchild域保存指向该结点第一个孩子的指针,nsibling域保存指向该结点下一个兄弟结点的指针。

      由于每一个结点都含有两个指针域,它很想是用来表示二叉树的二叉树链表结构,所以这种表示法又称为二叉树链表表示法。

      2.森林与二叉树的转换

      树的左孩子右兄弟表示法中,每个结点有两个指针,分别指向当前结点的左子结点及右兄弟结点。可以将这样的结构看作是二叉链表,一个二叉链表即可以解释为一棵树,又可以解释为一棵二叉树。由此在树与二叉树之间建立了关系。二叉树表成为他们相互转换的桥梁。

      若森林转换成二叉树的递归描述如下:

      如果F={T1,T2,‘’‘’‘’',Tn}是森林,则按如下规则将其转换为一颗二叉树B={root,LB,RB};

      • 若F为空,则B为空树

      • 若F非空,则B的根rooot为F中第一颗树T1的根;B的左子树 LB是从T1根据点的子树森林F1={T11,T12,、、、、T1n1}转换而成的二叉树;其右子树RB是从森林F={T2,T3,‘’‘’‘’‘,Tn}转换而成二叉树。

        3.树和森林的遍历

        树的遍历方式有两种,先序遍历和后续遍历。

        树的先序遍历过程;先访问根结点,再依次由左至右对每颗子树进行先序遍历。

        树的后续遍历过程;先依次由左至右对每颗子树进行后序遍历,再访问根结点。

        将树T转换为二叉树B,则树T的后序遍历序列与B的中序遍历序列相同。

        森林的遍历方式右两种:先序遍历和后序遍历。

        1)先序遍历

        先序遍历过程如下;

        如果森林为空则返回,否则

        • 访问森林中第一棵树的根结点

        • 先序遍历第一颗树根结点的子树森林

        • 先序遍历除去第一棵树之外剩余的树组成的森林。

          2)后序遍历

          后序遍历过程如下;

          如果森林为空则返回,否则

          • 后序遍历第一棵树根结点的子树森科;

          • 访问森林中第一棵树的根结点

          • 后序遍历除去第一棵树之外剩余的书组成的森林。

            1.3.4 树与二叉树的应用

            1.二叉排序树

            二叉排序树(BST)或者是一颗空树,或者是具有下列性质的二叉树;

            • 若它的左子树不为空,则左子树中所有结点的值均小于树根结点的值。

            • 若它的右子树不为空,则右子树中所有结点的值均大于等于数根结点的值。

            • 其左右子树也分别是二叉排序树。

              二叉排序树也称为二叉查找树,采用二叉链表结构存储。

              由于二叉排序树的有序性,在树中进行查找的效率较高。查找的对象称为查找目标,若找到称为查找成功;否则称为查找失败。

              二叉排序树各结点中保存的值称为关键字,有那些应用中,要求关键字具有唯一性。

              二叉排序树的每颗子树仍是二叉排序树。每个结点的左子结点的值均小于结点本身的值,其右子结点的值均大于等于结点本身的值。这个条件是其必要条件而非充分条件,换句话说,若一颗二叉树中每个结点左子结点的值小于结点的值,其右子结点的值大于等于结点的值,则树不一定是二叉排序树。

              二叉排序树T中的最小值位于其’‘左下角’,即从根开始沿指针lchild一直“”向下“,直到指针lchild为空的结点。同样,T中的最大值位于其”右下角“,即从根开始沿指针rchild一直”向下“,直到指针rchild为空的结点。

              对二叉排列树进行中序遍历,可得到一个升序序列。这是二叉排序树的特性之一。

              对于一般二叉树来说,仅直到树的先序序列或后序序列,不能唯一确定这棵二叉树。但是具体到二叉排序树。文章来源地址https://www.toymoban.com/news/detail-475340.html

到了这里,关于1.3.1 树与二叉树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [数据结构] 树与二叉树

    树是由 (n(n geq 0)) 个节点组成的有限集。当 (n = 0) 时,称为空树。 任意一棵非空树应满足以下两点: (1)有且仅有一个特定的称为根的节点; (2)当 (n 1) 时,其余节点可分为 (m(m0)) 个互不相交的有限集 (T_1, T_2, dots, T_m) ,其中每个集合本身又是一棵树,称为根的

    2024年03月09日
    浏览(41)
  • 数据结构--树与二叉树

    树的定义 树是n(n =0)个节点的有限集。当n=0 时,称为空树 在任意一棵非空树中应满足 有且仅有一个特定的称为根的结点 当n1 时,其余节点可分为m(m0) 个互不相交的有限集T1,T2……Tm,其中每个集合本身又是一棵树,并且称为根的子树 树是一种逻辑结构,也是一种分层结构 树的

    2024年02月22日
    浏览(44)
  • 【数据结构】树与二叉树(中)

    目录 前言: 一、顺序存储结构: 二、堆: 1.堆的性质: 2.堆的性质: 3.堆的实现: Ⅰ.堆的初始化:  Ⅱ.堆的插入(含向上调整):  Ⅲ.堆的删除(含向下调整算法): Ⅳ.取堆顶的数据: Ⅴ.堆中的数据个数: Ⅵ.堆的判空:  Ⅶ.堆的销毁: 总结:         上篇文章中,

    2024年02月16日
    浏览(46)
  • 数据结构_树与二叉树

    目录 1. 树的基本概念 1.1 树的定义 1.2 基本术语 1.3 树的性质 1.4 相关练习 2. 二叉树的概念 2.1 二叉树的概念及其主要特性 2.2 二叉树的存储结构 2.2.1 顺序存储结构 2.2.2 链式存储结构 2.3 相关练习 3. 二叉树的遍历和线索二叉树 3.1 二叉树的遍历 3.1.1 先序遍历 3.1.2 中序遍历 3.1

    2024年02月04日
    浏览(46)
  • 【数据结构与算法】树与二叉树

    除了之前我们讲的栈、队列、链表等线性结构,数据结构中还有着一对多的 非线性结构 ——— 树 。 树是有 n 个结点组成的有限集,当n=0时为空树,在任意一颗非空树中,有且仅有一个 特定的根结点 ;当n1时,其余结点又可以分为一棵树,称为根的 子树 。 如下图所示: A为

    2023年04月09日
    浏览(50)
  • 数据结构与算法——树与二叉树

    😊各位小伙伴久等了,本专栏新文章出炉了!!! 我又回来啦,接下来的时间里,我会持续把数据结构与算法专栏更新完。 👉树型结构👈 是一类重要的 ✍非线性数据结构 ,其中以树和二叉树最为常用,直观来看,树是以分支关系定义的层次结构。树型结构在客观世界中

    2024年02月11日
    浏览(46)
  • 【数据结构】树与二叉树(十三):递归复制二叉树(算法CopyTree)

      二叉树是一种常见的树状数据结构,它由结点的有限集合组成。一个二叉树要么是 空集 ,被称为 空二叉树 ,要么由一个根结点和两棵不相交的子树组成,分别称为 左子树 和 右子树 。每个结点最多有两个子结点,分别称为左子结点和右子结点。 引理5.1:二叉树中层数

    2024年02月01日
    浏览(40)
  • 【树与二叉树】二叉树顺序结构实现以及堆的概念及结构--详解介绍

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯 长路漫漫浩浩,万事皆有期待 普通二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而 完全二叉树适合使用顺序结构存储 。现实中我们通常把 堆

    2023年04月24日
    浏览(42)
  • 【数据结构】24王道考研笔记——树与二叉树

    树是n个结点的有限集合,n=0时,称为空树。非空树满足: 除了根节点外,任何一个结点都有且仅有一个前驱 结点的层次(深度):从上往下数 结点的高度:从下往上数 树的高度(深度):总共有多少层 结点的度:有几个孩子(分支) 树的度:各节点的度的最大值 森林:

    2024年02月13日
    浏览(50)
  • 数据结构与算法——树与二叉树篇详解

    树形结构是一种非常重要的 非线性结构 ,树形结构中数据元素之间具有 一对多 的逻辑关系。 1.1.1 树的定义 树是由n(n=0)个结点所构成的有限集合 当n=0时,称为空树 当n0时,n个结点满足以下条件 有且仅有一个称为根的结点 其余结点可分为m个互不相交的有限集合,且每一个

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包