2011年12月8日

数据结构和算法分析学习笔记(三)--二叉查找树的懒惰删除(lazy deletion)

摘要: 这次的问题来自《数据结构与算法分析(C++描述)》的习题4.16,如下:--------------------------4.16 重做二叉查找树类以实现懒惰删除.注意,这将影响所有的例程.特别具有挑战性的是findMin和findMax,它们现在必须递归的完成.-------------------------- 这题没有参考答案,我也不敢保证自己写的是对的,有不对的地方请指正,谢谢.先做一下说明,首先这只是一般的二叉查找树,不是AVL树.其次其中的printTree()函数只是将树中的结点按升序打印出来,不是像树的结构那样打印(可以参见这里的print()函数).最后,我定义的数据结构. 阅读全文

posted @ 2011-12-08 14:39 Barryhe 阅读(4479) 评论(0) 推荐(3) 编辑

2011年11月28日

数据结构与算法分析学习笔记(二)--AVL树的算法思路整理

摘要: 看完了《数据结构与算法分析(C++描述)》的4.4节AVL树,做一个总结,整理一下自己实现删除算法的思路.(注:本文中图片均来自《数据结构与算法分析(C++描述)》) AVL(Adelson-Velskii and Landis,由阿德尔森一维尔斯和兰迪斯在1962年提出,因此得名)树是带有平衡条件(balance condition)的二叉查找树. 我们知道空子树的高度通常被定义为-1,叶子结点的高度为0,其它结点的高度为其左右子树中的最大高度加1.一颗AVL树中的每一个结点的左子树和右子树的高度差不超过1.由此,我们可以考察一下一颗高度为h的AVL树的最少结点数S(h).显然S(0)=.. 阅读全文

posted @ 2011-11-28 16:34 Barryhe 阅读(7221) 评论(1) 推荐(2) 编辑

C++实践笔记(四)----AVL树的简单实现

摘要: 关于AVL树的分析,请见:数据结构与算法分析学习笔记(二)--AVL树的算法思路整理 这里给出AVL树的结构定义以及insert,remove和print三种操作的例程:1#include<iostream>2#include<list>3#include<utility>4#include<string>5usingnamespacestd;67staticconststringPRINT_SPACES="";89template<typenameObject>10classAVLTree11{12public: 阅读全文

posted @ 2011-11-28 16:30 Barryhe 阅读(2267) 评论(0) 推荐(1) 编辑

2011年11月16日

数据结构与算法分析学习笔记(一)--二叉树的遍历(非递归)

摘要: 题目来自《数据结构题集(C语言版)》,如下:6.37 试利用栈的基本操作写出先序遍历(二叉树)的非递归算法.----------------------------------------------------------先序遍历,就是以结点,左子树,右子树的顺序遍历二叉树.观察并仿照其递归算法执... 阅读全文

posted @ 2011-11-16 00:30 Barryhe 阅读(2512) 评论(3) 推荐(0) 编辑

2011年11月2日

C++学习笔记(八)----表(list)的实现

摘要: 接下来,我们根据《数据结构和算法分析 C++描述》中图3-12至3-20的代码,继续回顾类的有关知识. 代码如下: 1template<typenameObject>2classList3{4private:5structNode6{7Objectdata;8Node*prev;9Node*next;1011Node(constObject&d=Object(),Node*p=NULL,Node*n=NULL)12:data(d),prev(p),next(n){}13};1415public:16classconst_iterator17{18public:19const 阅读全文

posted @ 2011-11-02 22:24 Barryhe 阅读(4035) 评论(1) 推荐(0) 编辑

2011年10月31日

C++学习笔记(七)----向量(vector)的实现

摘要: 做了几道zoj的题目,感到基础知识都忘得差不多了,很有必要重新学习,选了两本书,一本是大学时的课本《数据结构(C语言版)》,循序渐进,由浅入深,相信学过数据结构的都看过或者听说过这本书.还有一本是在网上找到的,书名是《数据结构和算法分析 C++描述》,这本书文字比较简练,但其中包含的信息量很大,读起来很有味道,也让人很有激情,很好. 现在分析一下《数据结构和算法分析 C++描述》中图3-7,3-8的代码,看看能从这段代码中找到哪些需要注意的要点.代码如下:1template<typenameObject>2classVector3{4public:5explicitVector(i 阅读全文

posted @ 2011-10-31 14:45 Barryhe 阅读(4316) 评论(7) 推荐(0) 编辑

2011年10月25日

zoj1005

摘要: #include<vector>#include<iostream>#include<string>usingnamespacestd;vector<int>vec;intflag=0,ca,cb,n;voidfind(intx,inty){if(x==ca&&y==0){vec.push_back(-2);return;}if(x==0&&y==cb){vec.push_back(-3);return;}if(x!=ca&&y!=0&&flag!=-1){vec.push_back 阅读全文

posted @ 2011-10-25 17:15 Barryhe 阅读(828) 评论(0) 推荐(1) 编辑

2011年10月21日

zoj1002

摘要: #include<vector>#include<iostream>usingnamespacestd;intlength,ops;vector<vector<int>>city;intopenCount(intx,inty){intco=0;if(x>0&&city[x-1][y]!=0)co++;if(y>0&&city[x][y-1]!=0)co++;if(x<length-1&&city[x+1][y]!=0)co++;if(y<length-1&&c 阅读全文

posted @ 2011-10-21 15:15 Barryhe 阅读(971) 评论(0) 推荐(0) 编辑

2011年4月24日

C++实践笔记(三)----找到公主啦,好开心啊!

摘要: 看完电影,突然想到Paris和Helen还在地牢里呆着呢,得在学泛型算法之前救他们出来啊.于是拿起纸和笔坐到马桶上,就开始想了.回想起那个Helen不动的版本,算法也就是找到了所有的可能性,一步一步的走.那么,既然要找最短路径,我想,找遍所有的可能性是必须的,Helen会动也一样.怎样才能一点都不放过呢?在实践一里面,每走到一点,记录下走到这一点所花的步数,同时做个标记,就不会从别的路来这了.而且,搜寻的时候是广度优先,这样就保证了每到一点所花的步数都是最小的.但是,Helen如果会动,情况就复杂了.比如可能为了让Helen从某个死胡同里面出来,Paris得重复经过某个点.既然Paris经过某 阅读全文

posted @ 2011-04-24 15:19 Barryhe 阅读(888) 评论(2) 推荐(1) 编辑

2011年4月23日

C++实践笔记(二)----实现一个简单的文本查询程序

摘要: 学到关联容器,10.6,容器的综合应用:文本查询程序,决定不看课本实现它.题目如下:------------------------------------------------------------------------------我们将实现一个简单的文本查询程序来结束本章。我们的程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数,并列出每次出现所在的行。如果某单词在同一行中多次出现,程序将只显示该行一次。行号按升序显示,即第 7 行应该在第 9 行之前输出,依此类推。例如,以本章的内容作为文件输入,然后查找单词“element”。输出的前几 阅读全文

posted @ 2011-04-23 05:01 Barryhe 阅读(2589) 评论(0) 推荐(1) 编辑

2011年4月20日

C++学习笔记(六)----关于顺序容器

摘要: 顺序容器有三种:vector线性表,list链表,deque双端队列. -------------------------------------------------- 容器元素的初始化 1.C<T> c;默认构造函数,只有这一种构造函数不用指定元素个数,下面的其它方法都显示或者隐式指出了元素个数. 2.C c(c2);c2和c的容器类型和元素类型都必须相同. 3.C c(b,e);迭代器b,e所指向的容器的类型不必和C的类型相同,他们的元素类型也不必完全相同,只要相互兼容就可以了.这里的从b到e是左闭合区间[ ),也就是包括b不包括e. 4.C c(n,t); 5.C c(n 阅读全文

posted @ 2011-04-20 01:03 Barryhe 阅读(769) 评论(0) 推荐(0) 编辑

2011年4月15日

C++实践笔记(一)----迷宫算法初探

摘要: 前些天在园子里看到一篇关于"脱离地牢"算法的文章,看了题目就没有在往下看了.很想自己搞定它. 如果你感兴趣,不妨看完下面的题目,就把它复制粘贴下来,一个人琢磨,可以看C++语言的工具书,但是不要去看数据结构和算法的书,就只是一个人思考,收获应该会不小哦.脱离地牢题目描述:在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活。他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想着得到这两块石头了,只要把它们溶化,Satan就能吸收其精华大增自己的魔力。于是有一天他趁二人不留意,把他们带到了自己的地牢,分别困在了不同的地方。然后Sa 阅读全文

posted @ 2011-04-15 14:57 Barryhe 阅读(2601) 评论(1) 推荐(3) 编辑

2011年4月7日

C++学习笔记(五)----关于参数传递(2)

摘要: 数组形参1.如果形参是数组(非引用),那么编译器会忽略定义形参时指定的长度,所以就没有必要指定长度了.但是这时我们就应该确保调用函数时不会造成数组访问越界,课本上介绍了以下3种方式(1)标识符.就是在数组的结尾加上一个标识符,然后在函数调用的时候判断是否到了标识符.典型的例子就是C风格字符串(以'\0'结束).(2)传递两个指针给函数.一个是指向数组第一个元素的指针(比如数组名);另一个是指向数组最后一个元素的下一个地址的指针.这样在函数里通过判断是否已处理到数组最后一个元素的下一个地址来决定是否结束调用.这是一种比较标准的用法,不需要对数组做添加标识符之类的特殊处理.(3)除 阅读全文

posted @ 2011-04-07 23:54 Barryhe 阅读(490) 评论(1) 推荐(0) 编辑

2011年3月31日

C++学习笔记(四)----关于参数传递(1)

摘要: 指针形参1.可以用指针作为函数的形参,这时相当于对实参指针做复制操作,形参初始化后,这两个指针指向相同的对象.如果在函数体内通过形参指针改变所指向对象的值,那么显然以后对实参指针解引用也会发现值已经改变了;如果只是改变形参指针的本身的值,也就是让它指向另一个对象,那个实参不会受到影响.2.如果我们想使用指针形参,同时又想保护实参所指向对象的值,应该怎么办呢?我们可以将形参定义为指向 const 对象的指针,如:void use_ptr(const int *p){...}上例中,指针p是一个(自以为)指向const对象的指针,因此不管实参指针是不是"指向const对象的指针" 阅读全文

posted @ 2011-03-31 23:20 Barryhe 阅读(586) 评论(0) 推荐(2) 编辑

2011年3月30日

C++学习笔记(三)----关于at()和下标符[]

摘要: for循环语句 可以在for语句头中定义多个对象,但由于只能出现一个语句,因此所有的对象必须具有相同的一般类型: for(int ival=0,*pi=ia,&ri=val; ival!=size; ++ival,++pi,++ri) //…… --------------------------------------- std 所谓命名空间namespace,是指标识符的各种可见范围。 C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。 ----------------------------------------- try…catch… try块是用 阅读全文

posted @ 2011-03-30 22:04 Barryhe 阅读(3560) 评论(0) 推荐(1) 编辑

导航