数据结构小结

合集下载

南邮数据结构实验一

南邮数据结构实验一

实验报告(2014 / 2015 学年第二学期)课程名称数据结构实验名称线性表的基本运算及多项式的算术运算实验时间2015 年9 月28 日指导单位计算机科学与技术系指导教师黄海平学生姓名陈明阳班级学号Q学院(系) 贝尔英才专业信息科技强化班实验报告~SeqList() { delete[] elements; }bool IsEmpty() const;int Length() const;bool Find(int i, T& x) const;int Search(T x) const;bool Insert(int i, T x);bool Delete(int i);bool Update(int i, T x);void Output(ostream& out)const;private:int maxLength;T *elements;};template<class T>SeqList<T>::SeqList(int mSize){maxLength = mSize;elements = new T[maxLength];n = 0;}template<class T>bool SeqList<T>::IsEmpty() const{return n == 0;}template<class T>int SeqList<T>::Length()const{return n;}template<class T>bool SeqList<T>::Find(int i, T& x)const{if (i<0 || i>n - 1){cout <<"out of bounds"<< endl; return false;}x = elements[i];return true;}template<class T>int SeqList<T>::Search(T x)const{for (int j = 0; j < n; j++)if (elements[j] == x)return j;return -1;}template<class T>bool SeqList<T>::Insert(int i, T x){if (i<-1 || i>n - 1){cout <<"out of bounds"<< endl;return false;}if (n == maxLength){cout <<"over flow"<< endl;return false;}for (int j = n - 1; j > i; j--)elements[j + 1] = elements[j];elements[i + 1] = x;n++;return true;}template<class T>bool SeqList<T>::Delete(int i){if (i<0 || i>n - 1){cout <<"out of bounds"<< endl;return false;}if (!n){cout <<"over flow"<< endl;return false;}for (int j = i+1; j <n; j--)elements[j -1] = elements[j];n--;return true;}template<class T>bool SeqList<T>::Update(int i, T x){if (i<0 || i>n - 1){cout <<"out of bounds"<< endl;return false;}elements[i] = x;return true;}template<class T>void SeqList<T>::Output(ostream& out)const{for (int i = 0; i < n; i++)out << elements[i] << " ";out<< endl;}源.cpp:#include"seqlist.h"const int SIZE = 20;void main(){SeqList<int> LA(SIZE);int i = 0;for (i = 0; i<5; i++) LA.Insert(i - 1, i);LA.Insert(-1, 10);LA.Output(cout);}实现在线性表LA中插入0-4然后在一开始插入10 运行截图如下:多项式实验:定义类如下重构函数如下:源码:#include<iostream>using namespace std;class Term{public:Term(int c, int e);Term(int c, int e, Term* nxt);Term* InsertAfter(int c, int e);private:int coef;int exp;Term* link;friend ostream& operator<<(ostream &, const Term &);friend class Polynominal;};Term::Term(int c, int e) :coef(c), exp(e){link = 0;}Term::Term(int c, int e, Term *nxt) : coef(c), exp(e) {link = nxt;}Term* Term::InsertAfter(int c, int e){link = new Term(c, e, link);return link;}ostream& operator<<(ostream& out, const Term& val){if (0 == val.coef)return out;if (1!= val.coef)out<<val.coef;switch (val.exp){case 0:break;case 1:out<<"X"; break;default:out<<"X^"<<val.exp; break;}return out;}class Polynominal{public:Polynominal();~Polynominal();void AddTerms(istream& in);void Output(ostream& out)const;void PolyAdd(Polynominal& r);void PolyMul(Polynominal& r);private:Term* theList;friend ostream& operator<<(ostream &, const Polynominal &);friend istream& operator>>(istream&, Polynominal &);friend Polynominal& operator+(Polynominal &, Polynominal &);friend Polynominal& operator*(Polynominal &, Polynominal &); };Polynominal::Polynominal(){theList = new Term(0, -1); //头结点theList->link = NULL; //单链表尾结点指针域为空}Polynominal::~Polynominal(){Term* p = theList->link;while (p != NULL){theList->link = p->link;delete p;p = theList->link;}delete theList;}void Polynominal::AddTerms(istream & in){Term* q = theList;int c, e;for (;;){cout <<"Input a term(coef,exp):\n"<< endl;cin >> c >> e;q = q->InsertAfter(c, e);if (0 >= e) break;}}void Polynominal::Output(ostream& out)const{int first = 1;Term *p = theList->link;for (; p != NULL && p->exp >= 0; p = p->link){if (!first && (p->coef>0)) out<<"+";first = 0;out<< *p;}cout << endl;}void Polynominal::PolyAdd(Polynominal& r){Term *q, *q1 = theList, *p; //q1指向表头结点p = r.theList->link; //p指向第一个要处理的结点q = q1->link; //q1是q的前驱,p和q就指向两个当前进行比较的项while (p != NULL && p->exp >= 0)//对r的单循环链表遍历,知道全部结点都处理完{while (p->exp < q->exp) //跳过q->exp大的项{q1 = q;q = q->link;}if (p->exp == q->exp) //当指数相等时,系数相加{q->coef = q->coef + p->coef;if (q->coef == 0) //若相加后系数为0,则删除q{q1->link = q->link;delete(q);q = q1->link; //重置q指针}else{q1 = q; //若相加后系数不为0,则移动q1和qq = q->link;}}else//p>exp>q->exp的情况q1 = q1->InsertAfter(p->coef, p->exp); //以p的系数和指数生成新结点,插入q1后 p = p->link;}}void Polynominal::PolyMul(Polynominal& r){Polynominal result; //定义相乘后的数据Term *n = result.theList; //n指向result的头结点n = n->InsertAfter(0, 0); //在result的头结点后插入新结点,系数指数均为0 Term *p = r.theList->link; //p指向第一个要处理的结点while(p->exp >= 0) //对r的单循环链表遍历{Polynominal tmp; //存储某段相乘后的数据Term *m = tmp.theList; //m指向tmp的头结点Term *q = theList->link; //q指向表头结点的后继结点while(q->exp >= 0) //对当前对象的单循环环链表遍历{m = m->InsertAfter((p->coef)*(q->coef), (p->exp) + (q->exp)); //生成新结点插入n后 q = q->link;}result.PolyAdd(tmp); //将temp加到result上p = p->link;}Term *q = theList->link; //q指向表头结点的后继结点while(q != NULL) //删除原对象的所有数据{theList->link = q->link;delete q;q = theList->link;}q = theList;q = q->InsertAfter(0, 0);PolyAdd(result); //将result加到当前对象上}ostream &operator<<(ostream& out, const Polynominal& x){x.Output(out);return out;}istream &operator>>(istream& in, Polynominal &x){x.AddTerms(in);return in;}Polynominal & operator + (Polynominal &a, Polynominal &b){a.PolyAdd(b);return a;}Polynominal & operator * (Polynominal &a, Polynominal &b){a.PolyMul(b);return a;}int main()实验报告文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.。

数据结构(朱战立)章 (6)

数据结构(朱战立)章 (6)
30
Move Disk 2 from Peg A to Peg C Move Disk 1 from Peg B to Peg C Move Disk 3 from Peg A to Peg B Move Disk 1 from Peg C to Peg A Move Disk 2 from Peg C to Peg B Move Disk 1 from Peg A to Peg B Move Disk 4 from Peg A to Peg C Move Disk 1 from Peg B to Peg C Move Disk 2 from Peg B to Peg A Move Disk 1 from Peg C to Peg A
" from peg ", fromPeg, " to peg
/*把n-1个圆盘从auxPeg借助fromPeg移至
29
towers(n-1,auxPeg,toPeg,fromPeg); }设计一个测试主函数如下: #include <stdio.h> void main(void) {
Towers(4, 'A', 'C', 'B'); }程序运to Peg B
26
Move Disk i from Peg X to Peg Y 这样, 汉
诺塔问题的递归算法可设计如下: void towers(int n,
char fromPeg, char toPeg, char auxPeg)
{
if(n==1)
/*递归出口*/
{
printf("%s%c%s%c\n", "move disk
并不是每个问题都适宜于用递归算法求解。 适宜于用递归 算法求解的问题的充分必要条件是:

Python中将两个或多个list合成一个list的方法小结

Python中将两个或多个list合成一个list的方法小结

Python中将两个或多个list合成⼀个list的⽅法⼩结python中,list这种数据结构很常⽤到,如果两个或者多个list结构相同,内容类型相同,我们通常会将两个或者多个list合并成
⼀个,这样我们再循环遍历的时候就可以⼀次性处理掉了。

所以如何将两个或者多个list合并成⼀个就是我们接下来要讲的内容哦
python合并list
⽅法1,运算符:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = list1 + list2
print(list3)
⽅法2,extend()⽅法:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = list1.extend(list2)
print(list3)
⽅法3,切⽚⽅式:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1[len(list1):len(list1)] = list2
print(list1)
总结
第⼀种⽅法看起来很简单⽽且也很容易理解,第三种⽅法有助于对python切⽚的裂解。

以上所述是⼩编给⼤家介绍的Python中将两个或多个list合成⼀个list的⽅法⼩结,希望对⼤家有所帮助,如果⼤家有任何疑问欢迎给我留⾔,⼩编会及时回复⼤家的!。

数据结构李春葆 第2章 线性表

数据结构李春葆 第2章  线性表

2.2.1 线性表的顺序存储—顺序表
线性表的顺序存储结构:把线性表中的所有元素按照 其逻辑顺序依次存储到从计算机存储器中指定存储位臵开 始的一块连续的存储空间中。 这样,线性表中第一个元素的存储位臵就是指定的存储 位臵,第i+1个元素(1≤i≤n-1)的存储位臵紧接在第i个元 素的存储位臵的后面。 线性表 逻辑结构 顺序表 存储结构
回true,否则返回false。
bool ListEmpty(SqList *L) {
return(L->length==0);
}
本算法的时间复杂度为O(1)。
(4)求线性表的长度ListLength(L)
该运算返回顺序表 L 的长度。实际上只需返回 length成员 的值即可。
int ListLength(SqList *L)
( 3 )判线性表是否为空表 ListEmpty(L) :若 L 为空表, 则返回真,否则返回假。 ( 4 )求线性表的长度 ListLength(L) :返回 L 中元素个数。 ( 5)输出线性表 DispList(L): 当线性表 L不为空时,顺序 显示L中各节点的值域。 (6)求线性表L中指定位臵的某个数据元素 GetElem(L,i,&e) :用 e 返回 L 中第 i ( 1≤i≤ListLength(L) )个 元素的值。
void unionList(List LA,List LB,List &LC) { int lena,i; ElemType e; InitList(LC); for (i=1;i<=ListLength(LA);i++) //将LA的所有元素插入到Lc中 { GetElem(LA,i,e); ListInsert(LC,i,e); } lena=ListLength(LA); //求线性表LA的长度 for (i=1;i<=ListLength(LB);i++) { GetElem(LB,i,e); //取LB中第i个数据元素赋给e if (!LocateElem(LA,e)) //LA中不存在和e相同者,插入到LC中 ListInsert(LC,++lena,e); } }

129356615412031250《数据结构与算法实验》实验指导书暨实验报告(1-6)新

129356615412031250《数据结构与算法实验》实验指导书暨实验报告(1-6)新
int i;
Li->length=0;
for(i=0;i<m;i++) //输入 m 个学生的所有信息
{
printf("please input the %dth student's information:\n",i+1);
printf("num=");
scanf("%d",
); //输入第 i 个学生的学号
//自己设计主函数完成
{
《数据结构与算法实验》上机实验指导书暨实验报告
}
《数据结构与算法实验》上机实验指导书暨实验报告
(二)利用单链表完成一个班级学生课程成绩的简单管理
1、单链表结构体类型的定义 typedef struct Stu { int num; char name[10]; float wuli; float shuxue; float yingyu; }STUDENT;
typedef struct List {
stu[ListSize]; int length; }LIST;
//存放学生的数组定义,静态分配空间 //记录班级实际学生个数 //存放班级学生信息的顺序表类型
2、建立班级的学生信息
《数据结构与算法实验》上机实验指导书暨实验报告
void listcreate(LIST *Li,int m) //m 为该班级的实际人数 {
实验二 栈和队列的操作与应用
一、 实验目的
1.掌握栈和队列的基本操作,并能对其进行简单应用。
二、 实验内容
1.利用栈将一个十进制的正整数转换成 n 进制数据,并将其转换结果输出。 2.用顺序栈实现算术表达式求值。 3. 编程用一维数组模拟一个队列(顺序队列),实现入队列和出队列操作。

数据结构-哈夫曼树及其应用

数据结构-哈夫曼树及其应用

15
40 a
30 b
5
c
10 d
15 e
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
30
40 a
30 b
15
15 e
5
c
10 d
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
WPL=∑wi*li最小的二叉树称为“最优
i=1 n
二叉树”或称为“哈夫曼树”。
二、哈夫曼树及其应用
2.哈夫曼树的值为{w1,w2,...wn},构 造一棵最优二叉树。
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ②方法:
步骤1:构造一个具有n棵二叉树的森林F={T1,T2,......,Tn}, 其中Ti是只有一个根结点且根结点的权值为wi的二叉树。 步骤2:在F中选取两棵其根结点的权值最小的二叉树,从F 中删除这两棵树,并以这两棵二叉树为左右子树构造一棵 新的二叉树添加到F中,该新的二叉树的根结点的权值为 其左右孩子二叉树的根结点的权值之和。 步骤3:判断F中是否只有唯一的一棵二叉树。若是,则求 解过程结束;否则,转步骤2。
二、哈夫曼树及其应用
3.哈夫曼编码 ②压缩编码:
例如:对于刚才的4个字符的编码问题,可以按如 下不等长编码方案进行编码: A: 0 B: 00 C: 1 D: 01 则对于电文“ABACCDA”的二进制电码为: 000011010 总长为9位 问题:译码时可能出现多意性,即译码不唯一:
二、哈夫曼树及其应用

数据结构(C语言版)(第2版)

性质和存储结

5.5遍历二叉
树和线索二叉

1
4
5.7哈夫曼树
及其应用
2
5
5.8案例分析
与实现
5.9小结
习题
6.1图的定义和基本
术语
6.3图的类型定义
6.2案例引入
6.4图的存储结构
3
6.7案例分析
与实现
1
6.5图的遍历
4
6.8小结
2
6.6图的应用
5
习题
7.1查找的基本概念
7.2线性表的查找
7.3树表的查找
7.4散列表的查找
7.5小结
习题
8.1基本概念和排序
方法概述
8.3交换排序
8.2插入排序
8.4选择排序
3
8.7外部排序
1
8.5归并排序
4
8.8小结
2
8.6基数排序
5
习题
作者介绍
这是《数据结构(C语言版)(第2版)》的读书笔记模板,暂无该书作者的介绍。
感谢观看
用来学习,适合已经完全学会的人过来查漏补缺。
没有老师的同学可以去b站听听青岛大学王卓老师的课,教材是这本…。
严谨的教科书,和习题及上级指导一起阅读能学到很多东西,花了28个小时阅读,不过对于较难的一些算法
比如图算法的弗洛伊德算法,排序种的基数排序,二叉树中的avl树等还是一知半解,可能再花2个28小时能有突
数据结构(C语言版)(第2
版)
读书笔记模板
目录
01
思维导图
02
内容摘要
03
读书笔记
04
精彩摘录
05
目录分析
06

重庆大学计算机二级公共基础知识

全国计算机等级考试(NCRE)二级C第10讲全国计算机二级公共基础知识C 语言程序设计知识结构C语言程序设计知识结构主要内容⏹1、数据结构与算法⏹2、程序设计基础⏹3、软件工程基础⏹4、数据库设计基础算法的定义对解题方案准确而完整的描述称为算法。

算法是程序设计的核心算法的基本概念P1算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。

通俗点说,就是计算机解题的过程(计算的方法)。

在这个过程中,无论是形成解题思路(推理实现的算法)还是编写程序(操作实现的算法),都是在实施某种算法。

例:n 个数从大到小进行排序。

有多种排序方法,常用的有冒泡排序、选择排序等。

算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。

常考点算法的基本特征P1一个算法应该具有以下五个重要的特征:⏹有穷性⏹确定性⏹输入⏹输出⏹可行性一个算法必须保证执行有限步之后结束;算法的每一步骤必须有确切的定义;一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;一个算法有一个或多个输出,以反映对输入数据加工后的结果。

没有输出的算法是毫无意义的;算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成拥有足够的情报常考点算法与计算机程序算法____是一组逻辑步骤程序——用计算机语言描述的算法算法的表示INPUT r S=3.14 * r*r PTINT S 开始输入RS=3.14 *R*R 输出S结束问题:输入园的半径,计算园的面积一个算法的表示需要使用一些语言形式。

传统的算法-------图形法,如“流程图”和N-S 图目前常用的方法-------使用伪码描述算法。

算法好坏的描述:时间复杂度空间复杂度一般考点算法的复杂度⏹是算法效率的度量:时间复杂度和空间复杂度。

⏹表示:O(1)\O(n)\O(n^2)⏹算法时间复杂度:指执行算法所需要的计算工作量。

通常,一个算法所用的时间包括编译时间和运行时间。

计算机专业个人学习总结_计算机小结

计算机专业个人学习总结_计算机小结1. 基础知识非常重要计算机专业属于理工类学科,其基础知识对于后续专业课程的学习是非常重要的。

学生应该将时间和精力投入到学好计算机基础课程中,包括离散数学、数据结构、算法分析与设计等。

这些基础课程不仅是计算机专业的必修课程,而且在日后的工作中也会被广泛应用。

因此把握好基础知识非常重要。

2. 学会自主学习和思考计算机专业的知识更新速度非常快,我们应时刻保持学习的姿态,积极了解最新的技术和应用。

要避免被课本内容束缚,要有开阔的视野,了解最新的技术和应用,不断思考学科发展方向。

同时,我们还应该掌握自主学习的技巧,包括如何快速获取信息、分类整理等。

在日后的工作和学习中,自主学习和思考的能力将更加重要。

3. 实践和应用非常重要我们不能仅停留在理论的阶段,必须进行实践和应用。

实践可以培养我们的动手能力,并且让我们更好地理解课堂上的知识。

在实践中,我们应该尝试推陈出新,不断改善和完善自己的程序和体系。

此外,在大学期间积极参加实习和比赛等活动,可以让我们深入了解企业的运营和管理方式,提高实践能力和职业素养。

4. 团队协作和沟通能力非常重要计算机专业的学生在工作中往往需要与不同领域的人士进行合作和沟通,因此我们应该很好地锻炼团队协作和沟通能力。

在大学期间积极参加团队活动,可以加强与他人的交流和协作能力,提高敏锐度,培养团队合作精神。

这种能力对于整个团队的发展和职业发展都非常重要。

总之,计算机专业的学习有许多要点和注意事项。

需要持续学习和进步,充分利用大学期间提供的各种资源和机会,努力提高自己的能力和素质。

计算机专业是一个既有挑战,又有机遇的领域,我们应该做足准备,迎接未来的挑战。

数据结构-稀疏矩阵的三元组表存储方法


a .data 3 3 1 -3
b .data 3 2 1 12
a .data 4 3 6 14 求得 b .data 4 2 5 18
a .data 5 a .data 6 a .data 7
4 3 24
5 2 18 无!
6 1 15
b .data 5 b .data 6 b .data 7
31 9 3 4 24 4 6 -7
b .data 2 1 6 15
a .data 3 3 1 -3
b .data 3 2 1 12
a .data 4 3 6 14 求解 b .data 4 2 5 18
a .data 5 4 3 24
b .data 5 3 1 9
a .data 6 5 2 18
b .data 6 3 4 24
a .data 7 6 1 15
a .data 5 4 3 24
b .data 5
a .data 6 5 2 18
b .data 6
a .data 7 6 1 15
b .data 7
a .data 8 6 4 -7
b .data 8
a. mu=6 a. nu=7 a. tu=8 注:p=1:8,寻找 j=col 的a.data[ p]
a .data 2 1 3 9 Col=6 b .data 2 1 6 15
a .data 3 a .data 4
3 1 -3
b .data 3
3 6 14 求得 b .data 4
2 1 12 2 5 18
a .data 5 4 3 24
b .data 5 3 1 9
a .data 6 5 2 18
2.求解步骤分析:p=1:8, q的值=7
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、

基本概念

1、数据元素是数据的基本单位。 2、数据项是数据不可分割的最小单位。 3、数据结构的 逻辑结构(抽象的,与实现无关) 物理结构(存储结构)顺序映像(顺序存储结构)位置“相邻”非顺序映像(链式存储结构)指针表示关系 4、算法特性:算法具有正确性、有穷性,确定性,(可行性)、输入,输出 正确性:能按设计要求解决具体问题,并得到正确的结果。 有穷性:任何一条指令都只能执行有限次,即算法必须在执行有限步后结束。 确定性:算法中每条指令的含义必须明确,不允许由二义性 可行性:算法中待执行的操作都十分基本,算法应该在有限时间内执行完毕。 输入:一个算法的输入可以包含零个或多个数据。 输出:算法有一个或多个输出 5、算法设计的要求: (1)正 确 性:算法应能满足设定的功能和要求 。 (2)可 读 性:思路清晰、层次分明、易读易懂 。 (3)健 壮 性:输入非法数据时应能作适当的反应和处理。 (4)高 效 性(时间复杂度):解决问题时间越短,算法的效率就越高。 (5)低存储量(空间复杂度):完成同一功能,占用存储空间应尽可能少。 二、 线性表 1、线性表 List:最常用且最简单的数据结构。 含有大量记录的线性表称为文件。 2、线性表是n个数据元素的有限序列。 线性结构的特点: ①“第一个” ②“最后一个” ③前驱 ④后继。 3、顺序表——线性表的顺序存储结构 特点 a) 逻辑上相邻的元素在物理位置上相邻。 b) 随机访问。

2) 表长为n时,线性表进行插入和删除操作的时间复杂度为O(n), 插入一个元素时大约移动表中的一半元素, 删除一个元素时大约移动表中的(n-1)\2 。 4、线性表的链式存储结构 1) 类型定义 简而言之,“数据 + 指针” 2) 不带头结点的空表判定为 L= =null 带头结点的空表判定为 L->next= =null 循环单链表为空的判定条件为 L.next= =L 线性链表的最后一个结点的指针为NULL 头结点的数据域为空,指针域指向第一个元素的指针。 5、顺序表和单链表的比较

6、顺序存储:优点:存储密度大,可随机存储 缺点:大小固定;不利于增减节点;存储空间不能充分利用;容量难扩充 链式存储:优点:易于插入删除;可动态申请空间;表容量仅受内存空间限制 缺点:增加了存储空间的开销;不可以随机存储元素 三、 栈与队列 1、栈 栈:限定仅在表尾进行插入或删除操作的线性表。 栈顶:表尾端 栈底:表头 栈是先进后出的线性表。 插入栈顶元素称为入栈,删除栈顶元素称为出栈。

类似于顺序表,插入和删除操作固定于表尾。 3、队列 先进先出的线性表。 队尾入队 对头出队 允许插入的一端叫做队尾 允许删除的一端叫做对头 4、链队列 1. 树的定义 树(Tree):是 n(n≥0)个有限数据元素的集合。 在任意一棵非空树T中: (1)有且仅有一个特定的称为树根(Root)的结点,根结点无前趋结点; (2)当n>1时,除根结点之外的其余结点被分成m(m>0)个互不相交的集合T1,T2,„,Tm,其中每一个集合Ti(1≤ i ≤m)本身又是一棵树,并且称为根的子树。 2. 基本术语: 结点的度数:结点的非空子树(即后缀)个数叫作结点的度数 树叶、分支结点:左(右)子树均为空二叉树的结点称作树叶否则称作分支结点。 结点的层数:规定根的层数是0,其余结点的层数等于其父结点的层数加1 孩子和双亲: 树的深度: 树的度数:树中度数最大的结点度数叫作树的度数 树林:是由零个或多个不相交的树所组成的集合。 3. 二叉树性质: 1) 二叉树的第i层上至多有2i-1个结点。 2) 深度为k的二叉树至多有2k-1个结点。 满二叉树:深度为k,有2k-1个结点。 完全二叉树:给满二叉树的结点编号,从上至下,从左至右,n个结点的完全二叉树中结点在对应满二叉树中的编号正好是从1到n。 3) 叶子结点n0,度为2的结点为n2,则n0 = n2+1。 考虑结点个数:n = n0 + n1 + n2 考虑分支个数:n-1 = 2n2 + n1 可得n0 = n2+1

5. 遍历二叉树(先序DLR、中序LDR、后序LRD)方法与C语言描述 由二叉树的递归定义可知,一棵二叉树由根结点(D)、根结点的左子树(L)和根结点的右子树(R)三部分组成。因此,只要依次遍历这三部分,就可以遍历整个二叉树。一般有三种方法:先序(前序)遍历DLR(根左右)、中序遍历LDR(左根右)、 后序遍历LRD(左右根)。 7. 树和森林

树的存储结构 双亲表示法,孩子表示法,孩子兄弟表示法。 特点:双亲表示法容易求得双亲,但不容易求得孩子;孩子表示法容易求得孩子,但求双亲麻烦;两者可以结合起来使用。孩子兄弟表示法,容易求得孩子和兄弟,求双亲麻烦,也可以增加指向双亲的指针来解决。 赫夫曼编码(前缀码) 向左分支为0,向右分支为1,从根到叶子的路径构成叶子的前缀编码。 五、 图 1. 完全图:有1\2 n(n-1)条变得无向图 有向完全图:具有n(n-1)条弧的有向图。 权:与图的边或弧相关的数。 顶点v的度:和v相关联的边的数目。 入度:以顶点v为头的弧的数目 出度:以顶点v为尾的弧的数目 回路或环:第一个顶点和最后一个顶点相同的路径。 简单路径:序列中顶点不重复出现的路径。

边(弧)多则需要存储空间多。 ·十字链表: 十字链表是有向图的另一种链式存储结构。可以看成是将有向图的邻接表和逆邻接表结合起来的一种链表。在十字链表中,对应于有向图中每一条弧有一个结点,对应于每个顶点有一个结点。 ·邻接多重表 3. 图的遍历 1) 深度优先(DFS)搜索 访问方式:从图中某顶点v出发: a)访问顶点v; b)从v的未被访问的邻接点出发,继续对图进行深度优先遍历,若从某点出发所有邻接点都已访问过,退回前一个点继续上述过程,若退回开始点,结束。 2) 广度(宽度,BFS)优先搜索 a)访问顶点v ; b)访问同v相邻的所有未被访问的邻接点w1,w2, „wk; c)依次从这些邻接点出发,访问它们的所有未被访问的邻接点; 依此类推,直到图中所有访问过的顶点的邻接点都被访问;

4. 生成树和最小生成树 每次遍历一个连通图将图的边分成遍历所经过的边和没有经过的边两部分,将遍历经过的边同图的顶点构成一个子图,该子图称为生成树。因此有DFS生成树和BFS生成树。 1) 最小生成树 ·Kruskal算法 一句话,“不构成环的情况下,每次选取最小边”。 5. AOV-网 用顶点表示活动,边表示活动的优先关系的有向图称为AOV网。 拓扑排序:对AOV网络中顶点构造拓扑有序序列的过程。 拓扑排序的方法 (1)在有向图中选一个没有前驱的顶点且输出之 (2)从图中删除该顶点和所有以它为尾的弧 6. 关键路径 AOE网,关键路径 AOE网(Activity On Edge)——带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续时间。在工程上常用来表示工程进度计划。 关键路径:从源点到汇点的最长的一条路径,或者全部由关键活动构成的路径。 7. 最短路径 (1) 迪杰斯特拉算法 求一个顶点到其他各顶点的最短路径。 算法:(a) 初始化:用起点v到该顶点w的直接边(弧)初始化最短路径,否则设为∞; (b) 从未求得最短路径的终点中选择路径长度最小的终点u:即求得v到u的最短路径; (c) 修改最短路径:计算u的邻接点的最短路径,若(v,„,u)+(u,w)<(v,„,w),则以(v,„,u,w)代替。 (d) 重复(b)-(c),直到求得v到其余所有顶点的最短路径。 特点:总是按照从小到大的顺序求得最短路径。 六、 查找 1. 查找分为:静态查找表、动态查找表、哈希查找表 2. 静态查找表:对查找表只作查找操作的查找表。 动态查找表:查找过程中同时插入表中不含的元素,或者删除查找表中已有的元素的操作的查找表。 3. 顺序查找:顺序查找又称线性查找,是最基本的查找方法之一。顺序查找既 适用于顺序表,也适用于链表。 4. 二分法(折半)查找:是一种效率较高的查找方法,但前提是表中元素必须 按关键字有序(按关键字递增或递减)排列。 5. 索引顺序表查找又称分块查找。分块查找:块内无序、块间有序、如何分块 效率最高 6. 动态查找表:二叉排序树查找:二叉排序树的生成 二叉排序树(二叉查找树):或者是一颗空树。或者如下1若它的左子树不空,则左子树上所有的结点的值均小于他的根结点的值。2若右子树不空,则右子树所有结点的值均大于她得根结点的值。3 左右子树也分别为二叉排序树。 7. 哈希表:哈希函数构造:直接定址法、除留余数法、平方取中法,随机数法, 数字分析法 冲突解决方法:开放定址法、拉链法、公共溢出区法 七、 排序 1.插入类排序: ·直接插入排序 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。 ·折半插入排序 ·希尔排序 基本思想:先将整个待排序记录序列分成为若干个子序列分别进行直接插入排序,待整个序列中的记录 基本有序 时在对全体序列进行一次直接插入排序,子序列的构成不是简单的逐段分割,而是将像个某个增量的记录组成一个子序列。 2.交换类排序 ·起泡排序 也称冒泡法,每相邻两个记录关键字比大小,大的记录往下沉(也可以小的往上浮)。每一遍把最后一个下沉的位置记下,下一遍只需检查比较到此为止;到所有记录都不发生下沉时,整个过程结束(每交换一次,记录减少一个反序数)。 ·快速排序 在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。

相关文档
最新文档