第一段标题

摘要: leetcode中有这么一道题,非递归来实现二叉树的后序遍历。二叉树的后序遍历顺序为,root->left, root->right, root,因此需要保存根节点的状态。显然使用栈来模拟递归的过程,但是难点是怎么从root->right转换到root。方法1:对于节点p可以分情况讨论1. p如果是... 阅读全文
posted @ 2014-05-03 22:15 小雨淅淅 阅读(28290) 评论(1) 推荐(4) 编辑
摘要: http://blog.csdn.net/littlehedgehog/article/details/5442430 阅读全文
posted @ 2014-03-31 09:41 小雨淅淅 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 字符串匹配一般有两种常见的算法,BF(Brute Force)算法和KMP算法,下面分别说明一下,假定目标串S,长度为n,模式串P,长度为mBF算法是最直观的算法,从目标串S的起点0到n-m,依次遍历伪代码如下for i k'-1,显然违反了k'的性质2,假设不成立,也就是说正确的匹配不会发生在模式串P向右平移[1, k-k'-1]之间的某次,我们可以放心大胆的平移k-k'了。在大多数经典论述中,上面所说的k'就是next[k],接下来就该考虑如何求解next[k]了,根据我看到的资料,关于next[k]的解法应该是有两种,区别在于是否考虑P[k]和P[ 阅读全文
posted @ 2014-03-29 10:22 小雨淅淅 阅读(849) 评论(0) 推荐(0) 编辑
摘要: 函数调用大家都不陌生,调用者向被调用者传递一些参数,然后执行被调用者的代码,最后被调用者向调用者返回结果,还有大家比较熟悉的一句话,就是函数调用是在栈上发生的,那么在计算机内部到底是如何实现的呢?对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写数据段:保存初始化的全局变量和静态变量,可读可写不可执行BSS:未初始化的全局变量和静态变量堆(Heap):动态分配内存,向地址增大的方向增长,可读可写可执行栈(Stack):存放局部变量,函数参数,当前状态,函数调用信息等,向地址减小的方向增长,非常非常重要, 阅读全文
posted @ 2014-03-24 22:38 小雨淅淅 阅读(47849) 评论(0) 推荐(14) 编辑
摘要: C++中float用32位来表示,f = (-1)^S * T * 2^E,S是符号位,T是尾数,E是指数首先我们把f表示成科学计数法的形式,然后再写出其在内存中的表示,在这里T写成1.XXX的形式,所以可以表示24位尾数举例来说 f = 14.25f = (1110.01)B = (1.11001... 阅读全文
posted @ 2014-03-23 16:04 小雨淅淅 阅读(14725) 评论(4) 推荐(0) 编辑
摘要: VS2010-Debug版本 1 9: int *obj = new int(6); 2 00F714CE push 4 //压栈 3 00F714D0 call operator new (0F711EAh) //调用new函数返回分配的地址addr --- 0F711EAh是指令 jmp operator new 的地址 4 00F714D5 add esp,4 //恢复栈 5 00F714D8 mov dword ptr [ebp-0F8h],eax //把返回的地址addr赋给起始地址为ebp-0F8h的内存空间 6 00F714DE cmp dword ptr [ebp-0F8h], 阅读全文
posted @ 2014-03-21 17:29 小雨淅淅 阅读(1947) 评论(0) 推荐(0) 编辑
摘要: 最近偶尔看到一篇关于Linus Torvalds的访问,大神说大部分人都不理解指针。假设被要求写一段链表删除节点的程序,大多数的做法都是跟踪两个指针,当前指针cur和其父节点pre,这种实现很容易理解,但是并没有用到指针的精髓。Linus是怎么写的呢,且看源代码//链表之two star programming#include typedef struct node{ int value; struct node *next;}listNode;listNode *insert(listNode *head, int value){ listNode *newNode = new listNo 阅读全文
posted @ 2014-03-09 20:34 小雨淅淅 阅读(681) 评论(0) 推荐(0) 编辑
摘要: 下面网址中是红黑树很好的教材,很详细。http://blog.csdn.net/eric491179912/article/details/6179908另外经典教材就是算法导论中关于红黑树的章节了,以算法导论为主,实在不明白的地方再去网上查找资料。红黑树是一种特殊的二叉查找树,大家都知道二叉查找树... 阅读全文
posted @ 2014-03-07 10:53 小雨淅淅 阅读(546) 评论(0) 推荐(1) 编辑
摘要: 交换两个元素的值,有传指针和传引用两种方式,这里需要注意的是引用一旦定义必须赋值,一旦赋值不能更改,对象a的引用就是a的别名(alias)。(1)int &a;//a是int类型的引用(2)int *a;//a是int类型的指针(3)int *&a;//a是int*类型的引用,也就是a是指针的引用可以用下面示意图解释第一种交换方式,传递引用,swap1(int &x, int &y);第二种方式,传递指针swap2(int *x, int *y),第三种方式传递指针引用swap3(int*(&x), int*(&y))。分别如下所示 可以看到第一 阅读全文
posted @ 2014-03-03 10:33 小雨淅淅 阅读(1632) 评论(0) 推荐(0) 编辑
摘要: 由二叉树的前序和中序如何得到二叉树的后序呢?要给出答案,首先得明白什么是前序、中序、后序。二叉树前序:遍历顺序为,根节点、左子树、右子树;中序:遍历顺序为,左子树、根节点、右子树;后序:遍历顺序为,左子树、右子树、根节点可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左、右子树两个部分,然后递归调用即可。举个例子,前序 5 3 2 4 8 6 10 中序 2 3 4 5 6 8 10首先,5肯定是二叉树的根节点,然后5在中序里面的位置是3号(从0开始),此位置前面的是左子树中的节点,右面的是右子树的节点,即5 || 3 2 阅读全文
posted @ 2014-03-02 14:56 小雨淅淅 阅读(18530) 评论(1) 推荐(3) 编辑