数据结构和相关算法简介.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构和相关算法简介

数据结构 与相关算法简介 南开ACM协会 为什么需要更多的数据结构? C++里面已经提供了一些基本数据结构以及数组,但已有的数据结构种类太少,缺乏灵活性,只适用于较简单的问题 这里要介绍的数据结构 栈 队列 树 堆 注:此处针对学习算法和实际编程的需要讲解,较少涉及过于系统化的理论 栈 栈的特点是先进后出(FILO)或后进先出(LIFO) 栈顶(top) :插入、删除的一端; 栈底(bottom):固定不动的一端; 入栈、压栈(push):即插入一个元素; 出栈、弹栈(pop):即删除一个元素; 栈 递归函数中的应用:每次进入递归调用之前,要先把当前函数的数据记录下来,然后再进行递归,每次从栈中取前一次信息 队列 队列与栈相对,特点是先进先出(FIFO)或后进后出(LILO) 队首(front ) :进行删除的一端; 队尾(rear ) :进行插入的一端; 入队:在队尾插入一个元素; 出队:在队首删除一个元素; DFS与BFS的应用 深度优先搜索(DFS)需要利用递归函数,使用栈 广度优先搜索(BFS)将可以扩展的节点加入队列,然后依次扩展每一个节点 STL中的队列 STL=Standard Template Labrary 标准模板库 提供很多类模板和函数模板 #include queue using namespace std; 使用方法:queue数据类型 queue示例代码 int main(){ queueint a; int i; for(i=0;i10;++i){ a.push(i*i); } a.pop();a.pop(); printf(%d\n,a.front()); return 0; } 树 树是一个递归的定义: 1:空集是树 2:树有一个根。 3:根有n个儿子节点(n不定) 4:每个儿子节点又是一个树 树 树没有环 如果树有n个节点(包括根),那么就有n-1条边 没有儿子的节点叫做叶节点 儿子没有顺序 POJ 1308 Is it a tree /JudgeOnline/problem?id=1308 二叉树 二叉树就是每个节点最多只有2个儿子的树 儿子有左右儿子之分,顺序不能颠倒 完全二叉树 满二叉树 二叉树的遍历 前序遍历,中序遍历,后序遍历 利用递归函数实现中序遍历: void dfs(节点v){ dfs(v的左儿子); 处理节点v; dfs(v的右儿子); }//只需简单调整就可实现另外两种遍历 POJ 2255 Tree Recovery /JudgeOnline/problem?id=2255 给定树的前序遍历和中序遍历,要求输出后序遍历 二叉树的应用——表达式 右图表示 (1-5)/(6*(4+2)) 更一般的四则运算表达式 叶子节点记录数字 其他节点记录运算符 二叉树的实现 struct tree{ [ElemType] key; struct tree *lc, *rc; }; NKOJ 1751 Expressions /p1751.html 给出表达式二叉树的前序遍历,求层序遍历(按照BFS依次访问的顺序) 堆 一棵完全二叉树,如果满足父亲节点比儿子节点大(小),叫做最大(小)堆。 堆 - 插入 堆 - 删除 堆 – 更新 堆在STL中的实现 #include heap using namespace std; 堆的实例代码 int main( void ) { int i, a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; make_heap( a, a + 10 ); for ( i = 0; i 10; ++i ) { printf( %d , a[0] ); pop_heap( a, a + 10 - i ); } return 0; } TOJ 2196. Nuanrans Idol II /toj/showp.php?pid=2196 刁瑞 ID: doraemonok dorajudge 汪方 ID: wangfangbob * * 堆有三种操作:插入,删除,更新 插入操作: 对于一个已经排列好的堆,如何插入一个新的数据,使得堆的性质仍然保留。 看个例子: 首先把新数据放在树的结尾。 然后,与其父节点比较,如果比父节点大,则操作结束。如果比父节点小,则与父节点交换,之后再与新父节点比较,依次类推,直到找到比它小的父节点,或它变成根节点。 2 4 7 10 5 9 5 7 5 1 10 1 4 1 2 1 时间复杂度:O(logN) 删除操作: 把当前堆中的最小值取出,并且使剩余的树仍保持堆的性质。 1 2 5 4

文档评论(0)

jixujianchi + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档