抽象数据类型

第四章 抽象数据类型

一、认识抽象数据类型

抽象数据类型是指由一种数据结构和在其上的一组操作所组成的、并不具体关心数据的存储结构和操作的具体实现的抽象数据结构。

定义抽象数据类型的基本格式

ADT 抽象数据类型名

 {

 数据:<数据描述>

 操作:<基本操作的定义>

 }ADT 抽象数据类型名

例如,长方形可以抽象为(以Python为例):

class rectangle(object):

  def __init__(self,a,b):

    self.a=a

    self.b=b

 def area(self):

    s=self.a*self.b

    return s

  def perimeter(self):

    c=2*self.a+2self.b

    return c

二、用抽象数据类型表示队列和栈

1.用抽象数据类型表示队列

ADT 队列

  {  数据:

    队列元素;

    队头;

    队尾;

   操作:

    初始化;

    入队;

    出队;

    求长度;

    判断空;

    判断满;

  }ADT 队列

2.用抽象数据类型表示栈

ADT 栈

  {  数据:

    栈元素;

    栈顶;

    栈底;

   操作:

    初始化;

    入栈;

    出栈;

    判断空;

    判断满;

  }ADT 栈

三、用抽象数据类型表示二叉树

1.树的定义

树是n(n≥0)个节点的有限集。在任意一棵非空树中:①有且仅有一个特定的称为根的节点;②当n>1时,其余节点分为m(m>0)棵互不相交的有限子树,每棵子树又是一棵树。

2.树的基本概念

(1)节点的度:每个节点具有的子树数。

(2)分支节点和叶子节点:在一棵树中,度等于0的节点称为叶子节点,度大于0的节点称为分支节点或非终端节点。

(3)孩子节点、双亲节点、兄弟节点:在一棵树中,每个节点的子树的根,称为该节点的孩子节点,相应地,该节点被称为孩子节点的父节点。具有同一父节点的孩子节点互称兄弟节点。

(4)树的深度:树中所有节点的最大层数。

3.二叉树的定义

二叉树是一种特殊树形结构,它的特点是每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),而且二叉树的子树有左右之分,其次序不能任意颠倒。

在二叉树中,每个节点的左子树的根节点被称为左孩子,右子树的根节点被称为右孩子。二叉树有5种基本形态,如下图所示。

一棵深度为k且有2k-1个节点的二叉树称为满二叉树。在一棵二叉树中,除最后一层外,若其余各层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干个节点,则称此树为完全二叉树。满二叉树是完全二叉树的特例。

4.二叉树的抽象数据类型

二叉树的抽象数据类型的数据部分为一棵用任一种方式表示的二叉树,操作包括初始化二叉树、建立二叉树、遍历二叉树、查找二叉树、输出二叉树和清除二叉树等。

5.二叉树的遍历

若用L、D、R分别表示遍历左子树、访问根结点、遍历右结点,则对于一棵非空二叉树的遍历有DLR、DRL、LDR、LRD、RDL、RLD六种情况。若限定先左后右,则只有三种情况即DLR(前序遍历)、LDR(中序遍历)、LRD(后序遍历),如图所示。给定了二叉树的任何一种遍历序列,都无法唯一确定相应的二叉树。但是如果知道了二叉树的中序遍历序列和任意的另一种遍历序列,就可以唯一地确定二叉树。

 随堂练习

一、单项选择题

1.用抽象数据类型表示栈时,其数据部分不包括(  )。

A.栈底 B.栈顶 C.数据元素  D.求栈的长度

2.中序遍历二叉树,首先访问的是(  )。

A.树的根节点     B.左子树的左边叶子节点

C.左子树的根节点  D.左子树的右边叶子节点

3.下列选项中,说法错误的是(  )。

A.完全二叉树包含满二叉树

B.二分查找又称折半查找,查找前必须先排序

C.迭代和递归都是非常实用的算法之一,累加、累乘就是递归的应用

D.在同种类型的数据结构中,地址a中存储的是数据5,地址b中存储的数据是13243424,地址b中的数据元素所占的空间和地址a中的数据元素所占的空间一样大

4.按照二叉树的定义,具有3个节点的二叉树有(  )种。

A.3  B.4 C.5  D.6

5.以下选项中,不属于完全二叉树的是(  )。

A. B. C.  D.

6.如果树的根算第一层,那么一棵n层的二叉树最多有(  )个节点。

A.2n-1 B.2n C.2n+1 D.2*n+1

7.已知包含7个节点的二叉树的先根遍历是1 2 4 5 6 3 7(数字为节点的编号,下同),中根遍历是4 2 6 5 1 7 3,则该二叉树的后根遍历是(  )。

A.4 6 5 2 7 3 1  B.4 6 5 2 1 3 7 C.4 2 3 1 5 6 7 D.4 6 5 3 1 7 2

二、判断题

8.一般数据类型通常由具体语言系统内部定义,直接提供给用户使用,抽象数据类型通常由用户自定义。(  )

9.二叉树至少有一个根节点。(  )

10.满二叉树一定是一个完全二叉树。(  )

11.二叉树的叶子节点就是度为0的节点。(  )

三、填空题

12.抽象数据类型通常由用户自行定义,包括定义其所包含的数据和在这些数据上所进行的    

13.一棵深度为n的满二叉树,共有    个节点。

14.第k层二叉树上最多有    个节点 (k≥1)。

四、应用题

15.写出下列树形结构的前、中、后序遍历序列。

16.有一棵二叉树,先序遍历序列为ABDGCEF,中序遍历序列为DGBAECF,请画出该二叉树,并写出后序遍历序列。

17.建立一棵二叉树的示意图,使其中序遍历的结果为a*b+c/d。

18.把一个算术表达式表示成一棵二叉树:运算符作为根节点,运算符的前后两个运算对象分别作为根的左、右两棵子树。请你写出图中二叉树所表示的算术表达式。