2013年11月29日
摘要:
1、根据前序与中序,推导二叉树。举例来说:前序ABC,中序CAB,由前序直到A为根节点,由中序知道A的左边为左孩子,右边为右孩子。C为左孩子,B为右孩子。2、思考,由前序和后续,能否退出二叉树? 前序ABC,后序CBA。由前序ABC知道A为根节点,后面分成两块,每一块都是前序,前面一块为左孩子,后面一块为右孩子。由后序知道A为根节点,前面分成两块,每一块都是后序,前面一块为左孩子,后面一块为右孩子。都是分成两块,对于分成的两块,前面一块元素集合相同,后面一块元素集合相同。注意,集合不考虑元素的顺序。这样,就有两种情况: a、前面一块为BC,后面一块为空 b、前面一块为空,后面一块为BC ...
阅读全文
posted @ 2013-11-29 19:07
Andy Niu
阅读(1790)
推荐(0)
摘要:
1、二叉树递归遍历很简单,以前序遍历为例说明:1 void PrefixOrder(Node* node) 2 {3 if(node!=NULL)4 {5 coutvaluelchild);7 PrefixOrder(root->rchild);8 }9 } 中序遍历和后序遍历类似。2、考虑二叉树非递归遍历,思路:前序遍历特点,访问当前节点,然后访问左孩子,左孩子有孩子,继续访问左孩子的左孩子节点,直到没有左孩子,访问右孩子。因此。非递归遍历的思路就是,使用while,记录当前节点,往左一条路走到底,然后原路后退,访问右节点。
阅读全文
posted @ 2013-11-29 18:41
Andy Niu
阅读(218)
推荐(0)
摘要:
1、什么是左闭合区间? [first,last),就是包含first,但是不包含last的区间范围。2、为什么使用左闭合区间? 使用左闭合区间有两个方便的性质: a、first == last,说明没有区间元素 b、first!=last,说明区间至少有一个元素,而且多次first++,最终可以到达last c、查找target,返回的位置==last,说明在范围内没有找到target 编程中使用左闭合区间,更重要的是,提供了一致性。我们知道对于数组,和基于连续内存的集合,假如元素个数为5,可访问的范围是[0,5),注意下标5并不是有效元素。
阅读全文
posted @ 2013-11-29 17:01
Andy Niu
阅读(1165)
推荐(0)
2013年11月28日
摘要:
1、解决的问题: 考虑下面的需求,使用一个方法,一个是提供者,一个是使用者,二者之间的接口是头文件。头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者那里,方法应该被声明为__declspec(dllimport)。二者使用同一个头文件,作为接口,怎么办呢?2、解决办法: 使用条件编译:定义一个变量,针对提供者和使用者,设置不同的值。 1 #ifndef DLL_H_ 2 #define DLL_H_ 3 4 #ifdef DLLProvider 5 #define DLL_EXPORT_IMPORT __declspec(dllexpo...
阅读全文
posted @ 2013-11-28 20:15
Andy Niu
阅读(32181)
推荐(1)
摘要:
1、方法有三个部分:方法的拥有者,方法名,方法形参表。2、对象有表面类型和真实类型,编译器编译的时候,仅仅知道对象的表面类型,而不知道对象的真实类型。3、调用方法的时候,有很多同名方法,到底调用那个方法呢?4、依据是: a、如果是virtual方法,根据方法拥有者的真实类型,决定调用哪个方法。 b、根据形参表的表面类型,决定调用哪个方法。
阅读全文
posted @ 2013-11-28 19:44
Andy Niu
阅读(340)
推荐(0)
摘要:
1、C++的思路:无论是基本类型,还是类类型,对象的传递提供了两种方式,一个是整体拷贝,一个是复制引用。整体拷贝对应着copy构造和copy赋值,复制引用就是通过引用或者指针实现的,当然指针本身还是整体拷贝,也可以是引用。 C++对象既可以分配在栈上,也可以分配在堆上,分配在堆上的对象必须手工delete2、C# 的思路:类类型整体拷贝,代价大,基本类型代价小。基本类型是整体拷贝,类类型是复制引用。C#中的引用是对C++引用的强化,和C++指针的弱化。 C++中引用必须是一个对象的别名,而且必须至始至终是这个对象的别名。 C++指针可以修改指向对象的内容,可以修改指针的指向,也可以对指针...
阅读全文
posted @ 2013-11-28 19:35
Andy Niu
阅读(621)
推荐(0)
2013年11月26日
摘要:
1、vector的下标操作不会添加元素,只能针对已经存在的元素操作。2、map的下标操作具有副作用,key不存在,会在map中添加一个具有该key的新元素,新元素的value使用默认构造方法。3、为什么要这样设计? vector是基于连续内存的容器,在尾部操作效率高,使用push_back添加元素,使用下标必须保证下表存在元素。 map是基于节点的容器,元素有序。使用下标操作,第一步是查找key是否存在,map的内部实现是二叉树(AVL树或者红黑树),采用二分查找。不管是否存在key,查找key 的时候,也已经确定了key的位置。因此,如果不存在key,干脆添加一个,反正已经知道添加位置,..
阅读全文
posted @ 2013-11-26 18:57
Andy Niu
阅读(3854)
推荐(0)
摘要:
1、使用场景: 强制类型转换,有可能会导致异常。is与as就是为了解决这一问题,is与as永远不会抛出异常。2、is判断一个对象是否兼容于指定的类型,考虑里氏代换。Dog是Animal,而Animal不是Dog。3、as 与强制类型转换一样,区别是使用as是安全的。使用as如果转换失败,返回Null,不会抛出异常。4、使用is和as可以取代强制类型转换,分别如下: 1 a、使用is 2 if(a is Dog) 3 { 4 Dog d = (Dog)a; 5 ... 6 } 7 8 b、使用as 9 Dog d = a as Dog;10 if(d!...
阅读全文
posted @ 2013-11-26 18:34
Andy Niu
阅读(3611)
推荐(0)
摘要:
代码如下,使用了递归: 1 import sys 2 currDir = sys.path[0] 3 4 import os 5 def removeFile(dir,postfix): 6 if os.path.isdir(dir): 7 for file in os.listdir(dir): 8 removeFile(dir+'/'+file,postfix) 9 else:10 if os.path.splitext(dir)[1] == postfix:11 os.remove(dir)...
阅读全文
posted @ 2013-11-26 17:54
Andy Niu
阅读(6615)
推荐(1)
2013年11月25日
摘要:
1、类的成员分为静态成员和实例成员。为什么设计出静态成员和实例成员? 静态成员对类以及类的所有实例有意义,实例成员对每个实例有意义。考虑,Person类,有个age字段和maxAge字段。每个Person实例都有自己的age,但所有的Person实例都有相同的maxAge(最大年龄极限),因此,maxAge只需要一份就好了,大家共享。有两个好处:节约内存和保持一致。2、成员分为字段和方法,首先考虑字段: 静态字段:只有一块内存。 实例字段:每个实例都有专属于自己的一块内存。3、对于方法: 无论静态方法和实例方法,只有一块内存。那么问题来了,在成员方法中会使用实例的字段,怎么区分是哪个实...
阅读全文
posted @ 2013-11-25 20:08
Andy Niu
阅读(2438)
推荐(0)