随笔分类 - careercup
摘要:4.6 设计一个算法,找出二叉查找树中指定结点的“下一个”结点(也即中序后继)。可以假定每个结点都含有指向父节点的连接。思路:有两种情况:1)如果该结点存在右子树,则中序后继即为右子树中最小的结点。 2)如果该结点不存在右子树,则后继结点为使得所给结点在其祖先结点的左子树上的第一个祖先结点...
        阅读全文
                
摘要:4.5 实现一个函数,检查一棵二叉树是否为二叉查找树。参考:http://blog.csdn.net/sgbfblog/article/details/7771096C++实现代码:#include#include#includeusing namespace std;struct TreeNode...
        阅读全文
                
摘要:4.4 给定一棵二叉树,设计一个算法,创建含有某一深度上所有结点的链表(比如,若一棵树的深度为D,则会创建D个链表)。类似于leetcode:Populating Next Right Pointers in Each Node II解答这道题目本质上是个BFS,也就是说,如果已经构建了第i层结点的...
        阅读全文
                
摘要:4.3 给定一个有序整数数组,元素各不相同按升序排列,编写一个算法,创建一棵高度最小的二叉查找树。解答想要使构建出来的二叉树高度最小,那么对于任意结点, 它的左子树和右子树的结点数量应该相当。比如,当我们将一个数放在根结点, 那么理想情况是,我们把数组中剩下的数对半分,一半放在根结点的左子树, 另一...
        阅读全文
                
摘要:4.2 给定有向图,设计一个算法,找出两个结点之间是否存在一条路径。解答根据题意,给定一个有向图和起点终点,判断从起点开始,是否存在一条路径可以到达终点。 考查的就是图的遍历,从起点开始遍历该图,如果能访问到终点, 则说明起点与终点间存在路径。稍微修改一下遍历算法即可。使用广度优先遍历实现代码:#i...
        阅读全文
                
摘要:4.1 实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个结点,其两颗子树的高度差不超过1.C++实现代码:#include#include#includeusing namespace std;//Definition for binary treestruct TreeN...
        阅读全文
                
摘要:3.6 编写程序,按升序对栈进行排序(即最大元素位于栈顶)。最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中(如数组)。该栈支持如下操作:push、pop、peek和isEmpty。解答使用一个附加的栈来模拟插入排序。将原栈中的数据依次出栈与附加栈中的栈顶元素比较, 如果附加栈...
        阅读全文
                
摘要:3.5 实现一个MyQueue类,该类用两个栈来实现一个队列。解答队列是先进先出的数据结构(FIFO),栈是先进后出的数据结构(FILO), 用两个栈来实现队列的最简单方式是:进入队列则往第一个栈压栈, 出队列如果第二个栈不为空,则直接从第二个栈出队列,否则将第一个栈的数据依次压入第二个栈,然后出栈...
        阅读全文
                
摘要:3.4 在经典问题汉诺塔中,有3根柱子及N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自底向上从大到小依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时有以下限制:每次只能移动一个盘子;盘子只能从柱子顶端滑出移到下一根柱子;盘子只能叠在比它大的盘子上。请运用栈...
        阅读全文
                
摘要:3.3栈就像叠盘子,当盘子叠得太高时,就会倾斜倒下。因此,在真实的世界中,当一叠盘子 (栈)超过了一定的高度时,我们就会另起一堆,再从头叠起。实现数据结构SetOfStacks 来模拟这种情况。SetOfStacks由几个栈组成,当前一栈超出容量时,需要创建一个新的栈 来存放数据。SetOfStac...
        阅读全文
                
摘要:3.2 请设计一个栈,除pop与push方法,还支持min方法,可返回栈元素中的最小值。push、pop和min三个方法的时间复杂度必须为O(1)。我们假设除了用一个栈s1来保存数据,还用另一个栈s2来保存这些非冗余最小值。那么, 当我们将数据压到要s1时,同时将它和s2的栈顶元素比较,如果不大于s...
        阅读全文
                
摘要:3.1 描述如何只用一个数组来实现三个栈。解答我们可以很容易地用一个数组来实现一个栈,压栈就往数组里插入值,栈顶指针加1; 出栈就直接将栈顶指针减1;取栈顶值就把栈顶指针指向的单元的值返回; 判断是否为空就直接看栈顶指针是否为-1。如果要在一个数组里实现3个栈,可以将该数组分为3个部分。如果我们并不...
        阅读全文
                
摘要:2.7 编写一个函数,检查链表是否为回文。思路:1)可以利用链表中的元素采用头插法创建一个新的链表,然后比较两个链表的元素是否相等。 2)利用快慢指针,将链表后半部分逆转之后,比较前半部分与后半部分是否相等。 3)利用栈将链表中的元素保存,然后弹出与链表中元素比较。C++实现代码:#inc...
        阅读全文
                
摘要:2.6 给定一个有环链表,实现一个算法返回环路的开头结点。类似leetcode中Linked List Cycle IIC++实现代码:#include#includeusing namespace std;struct ListNode{ int val; ListNode *next...
        阅读全文
                
摘要:2.5 给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例:输入: (7->1->6)+(5->9->2),即617+295.输出:2->1->9,即912.进阶:假设这些数位是正向存放的示例:输入:(6...
        阅读全文
                
摘要:2.4 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。思路:将小于的结点还是保存在原来的链表中,将大于等于x的结点加入一个新的链表,最后将这两个链表链接起来。C++实现代码:#include#includeusing namespace std;struc...
        阅读全文
                
摘要:2.3 实现一个算法,删除单向链表中间的某个结点,假设你只能访问该结点。(即你不知道头结点)这个问题的关键是你只有一个指向要删除结点的指针,如果直接删除它,这条链表就断了。 但你又没办法得到该结点之前结点的指针,是的,它连头结点也不提供。在这种情况下, 你只能另觅他径。重新审视一下这个问题,我们只能...
        阅读全文
                
摘要:2.2 实现一个算法,找到单链表中倒数第k个节点。这道题的考点在于我们怎么在一个单链表中找到倒数第n个元素? 由于是单链表,所以我们没办法从最后一个元素数起,然后数n个得到答案。 但这种最直观的思路显然是没错的,那我们有没有办法通过别的方式,从最后的元素数起数 n个来得到我们想要的答案呢。这个次序颠...
        阅读全文
                
摘要:2.1 编写代码,移除未排序链表中的重复节点。不使用临时缓存:如果不允许使用临时的缓存(即不能使用额外的存储空间),那需要两个指针, 当第一个指针指向某个元素时,第二个指针把该元素后面与它相同的元素删除, 时间复杂度O(n2)。C++实现代码:#include#includeusing namesp...
        阅读全文
                
摘要:1.8 假定有一个方法isSubstring,可检查一个单词是否为其他字符串的子串。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次isSubstring。旋转字符串:”waterbottle”是”erbottlewat”的旋转字符串。解答题目说我们使用一次isSub...
        阅读全文
                
 
                    
                
 浙公网安备 33010602011771号
浙公网安备 33010602011771号