2012年5月24日

判断整数序列是不是二元查找树的后序遍历结果

摘要: 这个其实很简单(1)首先把给出的序列从小到大排列,这相当于是一个中序遍历的结果(2)有中序遍历和后续遍历重构二叉树(3)判断二叉树是否是二元查找树二元查找树: 它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二元查找树 阅读全文

posted @ 2012-05-24 21:57 为梦飞翔 阅读(333) 评论(0) 推荐(0)

查找最小的k个元素

摘要: 题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。思路:取K歌元素,找出最大值,然后与第K+1个比较,若大于第K+1个,则被替换,否则丢弃第K+1个(1)在数组中前K个的最大值,与K+1个比较,若大于第K+1个,最大值被替换,否则丢弃K+1个(2)接着K+i等等(3)结束后前K个技术最小值 阅读全文

posted @ 2012-05-24 20:08 为梦飞翔 阅读(241) 评论(0) 推荐(0)

微软面试4、在二元树中找出和为某一值的所有路径

摘要: 题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10 / / 5 12 / / 4 7则打印出两条路径:10, 12和10, 5, 7。思路1:(这个感觉不是最好的,看到的欢迎分享新方法)后续遍历二叉树,同时用一个变量sum记录栈中所有节点的和,当节点输出时,判断该节点是否是叶子节点,同时sum是否是目标和若两者均满足,则测试栈中的元素即是一条路径。代码: 1 View Code 2 void PathSum(BiTree BT,int SUM){ 3 St... 阅读全文

posted @ 2012-05-24 16:00 为梦飞翔 阅读(243) 评论(0) 推荐(0)

微软面试题2、设计包含min函数的栈

摘要: 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。思路:其数据结构如下Struct LinkNode{ DataType data; Struct LinkNode * next; Struct LinkNode * pMin;};第一个节点入栈的时候若为空,p->next=NULL;p->pMin=p;第二个节点入栈的时候,首先和栈顶元素pHead->pMin->data比较大小,若当前节点不大于它,则p->pMin=p否则,p->pMin=pHead->pMin; 阅读全文

posted @ 2012-05-24 14:52 为梦飞翔 阅读(159) 评论(0) 推荐(0)

微软面试题1、把二元查找树转变成排序的双向链表

摘要: 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / /6 14/ / / /4 8 12 16转换成双向链表4=6=8=10=12=14=16。首先我们定义的二元查找树 节点的数据结构如下:struct BSTreeNode{ int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node};基本思路1:(这个有新节点,用递归,见思路2)中序遍历二叉树, 阅读全文

posted @ 2012-05-24 14:10 为梦飞翔 阅读(446) 评论(0) 推荐(0)

读取文件的最后N行 问题思路来自 http://www.cnblogs.com/cobbliu/archive/2012/03/10/2388802.html

摘要: 思路两个:(1)快慢指针,和找链表倒数第K个节点有点类似。同样适用两个文件指针,fp,fs,把快的文件指针先读N行后,快慢文件指针同时一行一行的开始读取,直到快的文件指针读到文件最后,则慢的文件指针此时读到文件的倒数第N行,就可以开始数数慢的文件指针的内容直到读取文件结束。 1 void PrintfFileN(string filename,int n){ 2 File* fp,*fs; 3 int i; 4 char fpline[MAXLINE]; 5 char fsline[MAXLINE]; 6 if((fp = fopen(file... 阅读全文

posted @ 2012-05-24 12:35 为梦飞翔 阅读(680) 评论(0) 推荐(0)

关于常见排序算法稳定性分析和结论 转自http://hi.baidu.com/cuifenghui/blog/item/0587932b039557f9e7cd4051.html

摘要: 关于常见排序算法的稳定性分析和结论2007-10-16 9:25 这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。 阅读全文

posted @ 2012-05-24 09:54 为梦飞翔 阅读(202) 评论(0) 推荐(0)

删除链表中指定节点,要求时间复杂度为O(1)

摘要: 思路:(1)把要删除的节点的值与其next交换(2)删除其next(3)完成算法: 1 void DeleteNode(LinkList *p){ 2 if(p->next=NULL){ 3 free(p); 4 p=NULL; 5 }else{ 6 LinkList* lk=p->next; 7 int temp=p->data; 8 p->data=lk->data; 9 lk->data=temp;10 p->next=lk->next... 阅读全文

posted @ 2012-05-24 09:40 为梦飞翔 阅读(866) 评论(0) 推荐(0)

查找单向链表中倒数第K个节点

摘要: 基本思路:(1)将pSlow和pFast同时指向链表的头部(2)将快指针向后移动K位(3)快慢指针同时移动,当pFast为空时,pSlow就指向倒数第K个节点(4)结束算法: 1 LinkList* FindK(LinkList* LK,int K){ 2 LinkList *pSlow,*pFast; 3 pSlow=pFast=LK; 4 int i=0; 5 while(i<K){ 6 pFast=pFast->next; 7 i++; 8 } 9 while(pFast){10 pSlow=... 阅读全文

posted @ 2012-05-24 09:20 为梦飞翔 阅读(343) 评论(0) 推荐(0)

导航