摘要:
其实二叉树的遍历,这么经典的东西,我自己一直都不明白。递归算法那么简洁,让人神魂颠倒;非递归算法就那么不好理解。。。最近使劲想了一想,似乎有一些眉目了,于是记录下来。【思想】(1)递归思想。虽然非递归算法没有直接使用函数递归,但是使用了栈,所以实际上仍然是递归的思想。但是它递归的是那么朦胧,让人无法捉摸。可以从以下几个方面思考:首先,三个非递归遍历的算法开始都是向左走到树的最左下方的节点,并把路上遇到的节点入栈,这其实就是递归中的前一半过程。如下图所示:图中上半部分表示了一个递归函数的层层深入的栈结构,下面则是模拟了将二叉树的节点入栈的过程。以此类推,从最左下的节点向上的过程就是退栈的过程,也 阅读全文
posted @ 2011-05-11 22:56
微型葡萄
阅读(2490)
评论(0)
推荐(1)
摘要:
都有“快速”两个字,实际上快速选择算法跟快速排序算法的思想完全一样:先分区。也就是分治的思想。快速选择算法的目的就是找到数组中的第K大的数。我写的快速排序的算法见这里:http://hi.baidu.com/microgrape/blog/item/30b7f88a0166bd1bc9fc7a43.html可以对比一下下面的快速选择算法的代码。#include <iostream>#include <vector>using namespace std;//search the kth biggest numberint QuickSelect(vector<in 阅读全文
posted @ 2011-05-11 22:56
微型葡萄
阅读(2087)
评论(0)
推荐(2)
摘要:
【方法一】使用宏定义,判断long long类型的位数。#include <iostream>using namespace std;#define IS_64bit() (sizeof(long) == 8) #define IS_32bit() (sizeof(long) == 4)void main(void){ cout<<IS_32bit()<<endl; cout<<IS_64bit()<<endl;}【方法二】判断一个指针的大小。sizeof(ptr)。因为指针的位数代表了CPU所能寻址的范围,所以也能判断出来。通过 W 阅读全文
posted @ 2011-05-11 22:56
微型葡萄
阅读(376)
评论(0)
推荐(0)
摘要:
今天看到一个有意思的C++语法问题。就是如果一个派生类中含有与基类虚函数重名的静态成员函数,用指针调用会如何。代码如下:#include <iostream>using namespace std;class A{public:void virtual print(){ cout<<"A::print()"<<endl; }};class B :public A {public:void virtual print(){ cout<<"B::print()"<<endl; } } ; class 阅读全文
posted @ 2011-05-11 22:55
微型葡萄
阅读(684)
评论(0)
推荐(0)
摘要:
本文是第二遍重读此书的读书笔记,因此只捡了一些自己在重读时仍感重要的知识进行了记录。当然会有些东西遗漏,对我不重要的不一定对每个人都不重要。PS:这些东西还是需要一定的C++语法基础的。再PS:页数都是按照侯捷先生的中文版所标。粗体部分乃是重中之重。================================================================================【第一章】在虚拟继承的情况下,base class不管在继承链中被派生多少次,永远只存在一个实体。P11C++中凡是处于同一个access section的数据,必定保证以其声明次序出现在内 阅读全文
posted @ 2011-05-11 22:55
微型葡萄
阅读(483)
评论(0)
推荐(0)
摘要:
正则表达式中我们可以使用一对括号(此处单指小括号(),中括号[]和大括号{}不包括在内)将一个正则表达式扩起来以表示它是一个整体。例如:([0-9A-Za-z]+)表示括号内的进行整体匹配。但是在C#中,这种整体匹配还有一个小小的副作用:C#的正则表达式引擎将这种括号内的正则表达式组在结果中进行了保存。下面以一个例子说明。现在我们要匹配一个时间的格式:03/15/2010。表示的是MM/DD/YY... 阅读全文
posted @ 2011-05-11 22:55
微型葡萄
阅读(6721)
评论(0)
推荐(0)
摘要:
一道C++多态的题目,考察多态和构造顺序的。求输出结果:#include <iostream>#include <vector>class Base{public: Base(){ cout<<"Base::Base()"<<endl; virt(); }virtual void virt() { cout<<"Base::virt()"<<endl; }void func(){ cout<<"Base::func()"<<endl; }} 阅读全文
posted @ 2011-05-11 22:55
微型葡萄
阅读(431)
评论(0)
推荐(0)
摘要:
汤森路透的笔试题是IKM的标准试题--Internet Knowledge Measurement,软件开发的主要包括三种内容:C++语法/UML设计/SQL语句。考得很细节。这个笔试题是考虑时间因素的,如果是题目答对的一样多,如果时间越短,最后的成绩会越高;不会的题可以skip,因为答错还倒扣分。我记得我skip了很多SQL的题目,但是最后还是过了,我是那场第一个答完题目的。过了一周之后,HR通... 阅读全文
posted @ 2011-05-11 22:55
微型葡萄
阅读(582)
评论(0)
推荐(0)
摘要:
(1)基本思想我感觉可以把基数排序归类在“减治”的算法类别中,因为基数排序实际上每执行一次排序就能减少问题的规模(它是一种稳定的排序)。我们在日常生活中最常使用的十进制数的大小比较其实就是基数排序最好的实例(具体见本文第2节),我们在比较两个2位数时,会先比较其十位的大小,然后比较个位大小。例如,53和56。这是基数排序的MSD(most significant digital)的情况。当然,基数排序其实并没有用“比较”,基数排序和桶排序(bucket sort)都采用了“桶”作为每一步排序的存储单位。这些“桶”其实是排序好的。对于十进制数来说,一共只有0-9共10个桶。如果将乱序的数字(比如 阅读全文
posted @ 2011-05-11 22:55
微型葡萄
阅读(441)
评论(0)
推荐(0)
摘要:
a) 重载(overload)。重载这个名词本身比较简单,函数一共只有三个要素:函数名、形参、返回值。重载的要素是很明确的:函数重名,形参不同(个数或者类型不同都可以)。与返回值无关。但是一定请不要忘记重载另一个非常重要的要素:同一个作用域内才发生重载![重载与继承]关于这二者的关系有两条准则(仔细看,其实就是一条):如果派生类重定义了重载成员,则通过派生类型只能访问派生类中重定义的那些成员。如果派生类想通过自身类型使用所有的重载版本,则派生类必须要么重定义所有的重载版本,要么一个也不重定义。b) 覆盖(override)同一个作用域内满足一定条件会发生重载。那不同的作用域内呢?只满足一个条件 阅读全文
posted @ 2011-05-11 22:55
微型葡萄
阅读(503)
评论(0)
推荐(0)
浙公网安备 33010602011771号