当前位置:文档之家› 北京工业大学 数据结构 期末复习

北京工业大学 数据结构 期末复习


/ < < > > < > <
( < < < < < 错 <
) > > > > = >
# > > > > 错 > =
a/(b-c)+d*e# abc-/de*+
输入 a / ( b c ) + d * e # 动作 输出a />#,入栈 入栈 输出b - > ( ,入栈 输出c -出栈输出,直至( )==( ,出栈不输出 +</, /出栈输出 +>#,入栈 输出d *>+,入栈 输出e 连续出栈输出 栈内容 # #/ #/( ab 后缀表达式 对应算法步骤 a 1 4.2 2 1 4.2 1 3.2 3.2 4.1 4.2 1 4.2 1 5
Visit( root ) //中序
DepthOrder(root->rightchild());//访问右子树 }
Visit( root ) //后序
10.

生成二叉搜索树 45,53,12,37,3,100,61,24,90,78 12 3 24 37
45 53 100 61 78 90
二叉搜索树的删除
20 35
40
85
88
有左子树(改进)
若p(50)有左子树,则在左子树里找中序 周游的最后一个结点s(40),删除s,用s 的左子树代替s,用s代替被删p
这种方法可以降低二叉树的高度。
50 30 20 40 80 90 20 30 35 40 80 90
35
32
85
88
32
85
88
已知序列72,73,71,23,94,16,05,68 建堆
72
最小堆的插入

插入过程:插入点追加到最后,自下而上 依次比较父与子,直到满足堆的定义
12 14 12 12 15 13
15
14
15
19
20 17 18 19
13 17 18 19
14 17 18
24 22 26 13
24 22 26 20
24 22 26 20
插入13
2013
1413
最小堆的删除
数据的抽象
算法的抽象

类模板代表一类类,不代表具体的类 类模板的定义格式:
ADT定义类模板
template<class Type> //类型参数Type,使用时用具体数据类型代替 class className{ private: Type dataList; … public: methodName( ); … };
必须能够跟踪执行过程;求ASL。 堆概念、建堆、筛选、插、删的相关算法(过程) Huffman树构造及Huffman编码
深度优先周游二叉树(递归实现)
1. 2.
3. 4.
5.
6. 7. 8. 9.
template<class T> void BinaryTree<T>::PreOrder (BinaryTreeNode<T>* root) { if(root!=NULL){ Visit(root->value( )); //前序 DepthOrder(root->leftchild()); //访问左子树
具有n个结点的满二叉树,其叶子结点
的个数为____________。(如果一棵二叉树的
任何结点,或者是树叶,或者恰有两棵非空子树,则此二 叉树称作满二叉树 ,性质3.任何一棵二叉树,n0 = n2+1)
某棵二叉树的前序序列为ABDEFC,
中序序列为DBFEAC,则该二叉树对 应的后序序列的结果为___________。

常见上限g(n)的种类(用于比较各算法优劣)
n2
n
log
n
题型举例
算法指的是( A. 计算机程序 C. 排序算法 列 )。 B. 解决问题的计算方法 D. 解决问题的有限运算序
将长度为 n 的单链表接在长度为 m 的单链表之 后的算法时间复杂度为 ( ) 。 A. O( n ) B. O( 1 )
方法


抽象数据类型ADT
算法4个特性:通用性、有效性、确定性、有穷性 算法分析:T(n)、S(n)算法分析的相关概念;最差、最 佳与平均情况的意义
ADT的定义




三元组表示 ADT=(D,R,P) ADT 抽象数据类型名 { 数据对象D:<数据对象的定义> 数据关系R :<数据关系的定义> 基本操作P:<基本操作的定义> } ADT 抽象数据类型名 用C++类模板的声明表示ADT

链表优点



适用


按位置频繁进行读取、数据域占用空间小于指针域:用顺序 存储结构
题型举例
有序的顺序表与无序的顺序表相比,其操作优 势是( )。 A. 删除快
C. 生成快
B. 插入快
D. 查找快。
若对线性表进行的主要操作是按下标存取,且
很少插入和删除,则应该采用的存储结构是 _____ ;若需要频繁地对线性表进行插入和删 除时,则应该采用的存储结构是 。
^| A |^ B ^|B | ^| C | | E |^ ^|D|^ A
O(1)<O(logn)<O(n)<O(nlogn)<O(n2) 常数阶 对数 线性 对数乘积 平方 <O(n3)<….<O(2n)<O(n!) 立方 指数 阶乘 T 常数:g(n) = 1 2n 对数:g(n) = logn 线性增长: g(n) = n 二阶增长: g(n) = n2 g(n) = nlog(n), n <= nlog(n)增长率 <= n2 指数增长: g(n) = an
2.1.2 线性表的存储结构

逻辑结构存储空间 的映射


数据存储单元 建立映射 关系存储单元之间关系 建立映射

1.
线性表2类存储结构 顺序存储(定长的一维数组结构、向量型顺序存储结构


为整个元素动态分配连续空间 特点:逻辑相邻物理也相邻 按需分配(插入:分配一个结点/删除:回收一结点) 特点:逻辑相邻物理不一定相邻
先根次序周游森林 后根次序周游森林
= 前序周游二叉树
= 中序周游二叉树
树(森林)与二叉树的等价转换 树与森林的链式存储结构
动态“左子/右兄”二叉链表表示法
森林与二叉树的等价转换



森林由3部分组成: 森林中第一棵树的根结点 森林中第一棵树的子树森林 森林中其它树构成的森林
动态“左子/右兄”二叉链表表示法

顺序表优点


存储紧凑(逻辑结构由存储相对位置体现,没使用指针,不 用花费附加开销 ) 随机访问(给定下标,常量时间可定位) 不限定长度(无需事先了解线性表的长度,允许线性表的长 度有很大变化 ) 不必移动,仅需改指针即可插删(能够适应经常插入删除内 部元素的情况 ) 不能确定长度上限、频繁插删:用链式存储结构
5.6 Huffman树及其应用

a: 0001
建树
0 0
100 0 42
1
b:10 c:1110
19
11
23
f 6
0 29
b 2
58 1 29 14
e 5
d:1111 f:01
1
g:0000
h:001
8
1
15 0 7
c 3
d 4
h 8
3
g 7
5
a下标:1
8
与算法有关的典型例题
已知一棵二叉树的前序和中序(后 序和中序)遍历序列,构造对应的 二叉树 通过二叉树,获得对应的树与森林 的相关信息 深度周游与广度周游二叉树

C++引入模板概念,是想突出数据的逻辑结构而忽略 其具体的数据类型
声明、定义和使用 C++类模板(2)
类模板:描述了一组相关的类,它们只能通过类型来区分 1、类模板声明:仅提供了类的名称和类的模板参数 template <class Elem> //类模板 Array 可接受任何类型作为参数 class Array { Elem* data; int size; //声明类模板Array的类数据 public: Array( int sz ) ; //函数成员 int GetSize( ) ; }; 2、函数成员定义 template <class Elem> Array<Elem>::Array( int sz ) { size = sz; data = new Elem[size];} template <class Elem> int Array<Elem>::GetSize( ){ return size; } 3、类模板的用法 Array<int> int_array(100); //Array接收int作参数, //int_array为长100的int型数组对象
在二叉搜索树里删除结点时,不是把以这个
结点为根的子树都删除掉,只是删除一个结 点,并且还要保持二叉搜索树的性质。
删除过程分为两种情况:
没有左子树 有左子树
没有左子树
若结点p没有左子树,则用右子树的根代替被删除 的结点p。
50
30
20 35 32 40
80
90 85 88 32
50
相关主题