网站大量收购独家精品文档,联系QQ:2885784924

第9章__树_零基础学数据结构重点.ppt

  1. 1、本文档共84页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第9章 树 从第3章到第8章介绍的线性表、栈、队列、串、数组和广义表都属于线性结构。本章要介绍的树和下一章要介绍的图都属于非线性数据结构。线性数据结构中的每个元素有唯一的前驱元素和唯一的后继元素,即前驱元素和后继元素是一对一的关系。 9.1 树 树是一种非线性的数据结构,树中的元素之间的关系是一对多的层次关系。本节主要介绍树的定义和树的抽象数据类型。 9.1.1 树的定义 树是n(n≥0)个结点的有限序列。其中,n=0时,称为空树。当n0时,称为非空树,满足以下条件: (1)有且只有一个称为根的结点。 (2)当n1时,其余n-1个结点可以划分为m个有限集合T1,T2,…,Tm,且这m个有限集合不相交,其中Ti(1≤i≤m)又是一棵树,称为根的子树。 9.1.2 树的逻辑表示 树的逻辑表示方法可以分为四种:树形表示法、文氏图表示法、广义表表示法和凹入表示法。 9.1.2 树的抽象数据类型 1.数据对象集合 2.基本操作集合 9.2 二叉树 在对一般树进行深入的学习之前,先学习一下一种比较简单的树──二叉树。本节的主要学习内容包括二叉树的定义、基本性质及二叉树的抽象数据类型。 9.2.1 二叉树的定义 二叉树是由n(n≥0)个结点构成的另外一种树结构。二叉树中的每个结点最多只有两棵子树,并且二叉树中的每个结点都有左右次序之分,即次序不能颠倒。 9.2.1 二叉树的定义 9.2.2 二叉树的性质 二叉树具有以下重要的性质。 性质1 在二叉树中,第m(m≥1)层上至多有2m-1个结点(规定根结点为第一层)。 性质2 深度为k(k≥1)的二叉树至多有2k-1个结点。 性质3 对任何一棵二叉树T,如果叶子结点总数为n0,度为2的结点总数为n2,则有n0=n2+1。 性质4 如果完全二叉树有n个结点,则深度为 。符号 表示不大于x的最大整数。 性质5 如果完全二叉树有n个结点,按照从上到下,从左到右的顺序对二叉树中的每个结点从1到n进行编号,则对于任意结点i有以下性质: 9.2.2 二叉树的性质 (1)如果i=1,则序号i对应的结点就是根结点,该结点没有双亲结点。 (2)如果2×in,则序号为i的结点没有左孩子结点。 (3)如果2×i+1n,则序号为i的结点没有右孩子结点。 9.2.3 二叉树的抽象数据类型 1.数据对象集合 2.基本操作集合 9.3 二叉树的存储表示与实现 二叉树的存储结构有两种:顺序存储表示和链式存储表示。本节的主要学习内容包括二叉树的顺序存储表示、二叉树的链式存储表示及二叉树的基本操作实现。 9.3.1 二叉树的顺序存储 我们已经知道,完全二叉树中每个结点的编号可以通过公式计算得到,因此,完全二叉树的存储可以按照从上到下、从左到右的顺序依次存储在一维数组中。 9.3.1 二叉树的顺序存储 9.3.2 二叉树的链式存储 在二叉树中,每个结点有一个双亲结点和两个孩子结点。从一棵二叉树的根结点开始,通过结点的左右孩子地址就可以找到二叉树的每一个结点。因此二叉树的链式存储结构包括三个域:数据域、左孩子指针域和右孩子指针域。其中,数据域存放结点的值,左孩子指针域指向左孩子结点,右孩子指针域指向右孩子的结点。 9.3.2 二叉树的链式存储 9.3.2 二叉树的链式存储 二叉链表存储结构的类型定义描述如下: typedef struct Node /*二叉链表存储结构类型定义*/ { DataType data; /*数据域*/ struct Node *lchild; /*指向左孩子结点*/ struct Node *rchild; /*指向右孩子结点*/ }*BiTree,BitNode; 9.3.3 二叉树的基本运算 采用二叉链表存储结构表示的二叉树的基本运算实现如下所示。以下算法的实现保存在文件“LinkBiTree.h”中。 (1)二叉树的初始化操作。 void InitBitTree(BiTree *T) /*二叉树的初始化操作*/ { *T=NULL; } 9.3.3 二叉树的基本运算 (2)二叉树的销毁操作。 void DestroyBitTree(BiTree *T) /*销毁二叉树操作*/ { if(*T) /*如果是非空二叉树*/ { if((*T)-lchild) DestroyBitTree(((*T)-lchild)); if((*T)-rchild) DestroyBitTree(((*T)-rchild)); free(*T); *T=NULL; } } 9.3.3 二叉树的基本运算 (3)创建

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档