刷题记录
文章平均质量分 69
MC丶吼吼
跪求offer养家糊口。。
展开
-
二叉树应用_重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 分析:二叉树的前序遍历为:根、左、右。所以对应的第一个节点就为根节点。确定根节点之后,扫描中序遍历序列,找到对应的根节点,即可根据中序遍历的特点(左、...原创 2018-06-13 12:58:46 · 134 阅读 · 0 评论 -
链表问题_复杂链表的复制
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空...原创 2018-06-29 14:54:49 · 188 阅读 · 0 评论 -
链表问题_两个链表的第一个公共节点
题目:输入两个链表,找出它们的第一个公共结点 分析:对于这个问题有三种思路: 1、蛮力算法,当遍历到一个节点时,就在另外一个链表上顺序遍历,并且判断是否相等,如果想等就是第一个重合的节点,对于两个长度分别为m和n的链表,所需要的时间为O(m*n)。实现如下: struct ListNode { int val; struct ListNode *next;...原创 2018-06-29 15:55:08 · 257 阅读 · 1 评论 -
链表问题_从尾到头打印链表
题目:输入一个链表的头节点,从尾到头打印链表。 分析:有两种思路,1、借助栈,从头到尾遍历链表将值存入栈中,然后输出栈中的值即可。2、可以使用递归,递归的本质就是一个栈结构,但是当链表很长的时候,会导致函数调用的层级很深,从而导致函数调用栈溢出,这里仅给出解法。/*解法1*//*** struct ListNode {* int val;* stru...原创 2018-06-27 15:02:22 · 109 阅读 · 0 评论 -
链表问题_在O(1)时间内删除链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该结点。 分析:对于删除单向链表中的节点,通常的思路:删除节点I之前,先从链表的头结点开始遍历到I前面的一个节点h,把h的next节点指向I的下一个节点j,再删除节点I,但是这样做的复杂度为O(n)。这里采用另外一种思路,把节点j的内容复制覆盖节点I,接下来再把节点I的next指向j的下一个节点,之后再删除节点j。...原创 2018-06-27 15:53:33 · 272 阅读 · 0 评论 -
链表问题_链表中倒数第K个节点
题目:输入一个链表,输出该链表中倒数第k个节点。尾节点为倒数第一个节点。 分析:可以采用两个指针,记为start和end,先让end在链表上走k-1步,然后两个节点同时开始走,当end到达尾节点时,start即为倒数第k个节点。这相当于做了一个长度为k的标尺一样,虽然很简单,但是在涉及到指针的操作时,一定要注意代码的鲁棒性,具体如下:/*struct ListNode { in...原创 2018-06-27 16:27:47 · 152 阅读 · 0 评论 -
链表问题_反转链表
题目:输入一个链表的头结点,翻转该链表之后输出头结点。 分析:翻转一个链表即翻转其连接方向,定义三个指针,pnode表示当前遍历到的节点;p_pre为pnode的前驱,p_succ为pnode的后继,之前的连接方向为p_pre->pnode->p_succ,将其改为p_pre<-pnode<-p_succ即可,在实现的过程中要注意代码的鲁棒性。实现如下: Lis...原创 2018-06-27 17:06:50 · 126 阅读 · 0 评论 -
链表问题_合并两个排序链表
题目:输入两个递增排序的链表,合并这两个排序链表,使得合并之后的链表仍然使递增排序的。 分析:即是归并排序中的归并操作,有两种具体的实现:1、使用递归的方法,2、迭代版本,逐个合并链表。实现如下:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : va...原创 2018-06-27 19:31:17 · 122 阅读 · 0 评论 -
链表问题_链表中环的入口节点
题目:一个链表中包含环路,求链表的入口节点。 分析:根据求链表中倒数第K个节点的方法,这个问题可以分为两个步骤:1、判断链表中的节点个数记为K,对于这个可以采用一快一慢两个指针,当两个指针相遇时,则相遇的节点就在环中,然后根据此节点就可以求出环的大小。2、由于已经知道环的个数,就可以使用类似于求链表倒数第K个节点的方法,使用两个指针,他们之间的间隔为K,两个同时在链表上移动,当他们相遇时的节点,...原创 2018-07-03 09:34:45 · 245 阅读 · 0 评论 -
链表问题_删除排序链表中的重复节点
题目:在一个排序链表中删除其中重复的节点,重复的一个不留。 分析:若我们定义的函数无返回值则应该讲函数的参数定义成**phead,因为头结点也可能被删除,具体的实现如下: struct ListNode { int val; struct ListNode *next; ListNode(int x) : val...原创 2018-07-03 11:25:23 · 382 阅读 · 0 评论 -
二叉树应用_二叉搜索树的第K个节点
题目:给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。 分析:进行中序遍历,中序遍历序列的数值是递增排序的。 /*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;...原创 2018-06-15 16:15:46 · 339 阅读 · 0 评论 -
二叉树应用_序列化二叉树
题目:实现两个函数,实现序列化和反序列化二叉树。 分析:我们可以从前序遍历和中序遍历序列构造出一个二叉树。我们可以先把一颗二叉树序列化成一个前序遍历序列和一个中序遍历序列,然后进行构造。但是这个思路有两个缺点,一个是要求两个序列中所有数据都读出后才能开始反序列化,另外要求不能有数值重复的节点。 我们可以根据前序遍历的顺序来序列化二叉树,前序遍历是从根节点开始的。当在遍历二叉树碰到NULL指针时...原创 2018-06-15 10:59:05 · 119 阅读 · 0 评论 -
二叉树应用_树的子结构
题目: 输入两棵二叉树A和B,判断B是不是A的子结构(空树不是任一树的子结构)。分析:要想查找树A中是否存在和树B一样的结构,我们可以分成两步: 1、在树A中找到和树B的根节点一样的节点R 2、在判断树A中以R为根节点的树中是不是包含和树B一样的结构。 具体实现如下:/*struct TreeNode { int val; struct TreeNode *left...原创 2018-06-13 13:32:41 · 119 阅读 · 0 评论 -
二叉树应用_二叉树镜像(对称)
题目:完成一个函数,输入一个二叉树,该函数输出它的镜像。 如: 分析:对于一个二叉树的镜像过程,我们可以先前序遍历这棵树的每一个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有的飞叶子节点之后,就得到了树的镜像。 具体实现:/*struct TreeNode { int val; struct TreeNode *left; struc...原创 2018-06-13 13:48:23 · 376 阅读 · 0 评论 -
二叉树应用_打印二叉树
题目:从上往下打印二叉树的每个节点,同一层的节点按照从左往右的顺序打印。 分析:每次打印一个节点的时候,如果该节点有子节点,就把该节点的子节点放到一个队列的末尾。每次打印队列头部的节点。直到队列中的所有节点都被打印出来为止。 实现如下:/*struct TreeNode { int val; struct TreeNode *left; struct Tree...原创 2018-06-13 15:24:41 · 240 阅读 · 0 评论 -
二叉树应用_二叉搜索树的后续遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历序列的结果。假设输入的数组的任意两个数字都互不相同。 分析:在二叉搜索树的后序遍历中,根节点在最后面。前面的序列可以分为两个部分:一个为左子树,小于根节点的值;一个为右子树,大于根节点的值。左子树序列和右子树序列同样应该为后序遍历序列,则可以通过递归判断是否满足。 具体实现:bool VerifySquenceOfBST(v...原创 2018-06-13 16:03:45 · 115 阅读 · 0 评论 -
二叉树应用_二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点往下一直到叶节点所经过的结点形成一条路径。 分析:在二叉树的前序、中序、后序三种遍历方式中只有前序遍历先访问的是根节点。因此采用前序遍历的方式遍历树,当遍历到某一个节点时,我们把该结点添加到路径上,并且累加结点的值。并且,如果该结点为叶节点且累加的和刚好为输入的整数,则当前路劲符合要求,我们把它打印出来。如...原创 2018-06-13 16:42:44 · 136 阅读 · 0 评论 -
二叉树应用_二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点的指向。 分析:由于要求转换之后的链表是排好序的,我们采用中序遍历,遍历树中的每一个节点。根节点、左子树和右子树。在把左、右子树都转换成双向链表之后再和根节点连接起来,整颗二叉树就转换成了排序好的双向链表。 实现如下:/*struct TreeNode { int va...原创 2018-06-13 17:16:01 · 101 阅读 · 0 评论 -
二叉树应用_二叉树深度
题目:输入一颗二叉树的根节点,求该树的深度。 分析:方法一:在二叉树中和为某一值的路径中已经知道了如何存取树的一条路径,这里我们可以用此方法求出树的最长路径,也就是树的深度。方法二:树的深度即是左、右子树中深度较大的值加1,可以采用此方法进行递归。 方法一实现如下:/*struct TreeNode { int val; struct TreeNode *left; ...原创 2018-06-14 11:28:59 · 162 阅读 · 0 评论 -
二叉树应用_树中两个节点的最低公共祖先
题目:给定树中的两个节点,找出这两个节点的最低公共祖先。情况1:当给定的树为二叉搜索树时。 分析:由于二叉搜索树是排序过的,位于左子树的节点都小于根节点,位于右子树的节点都大于根节点。如果要查找的两个节点比根节点大的话,则最低公共祖先在右子树中;如果要查找的两个节点比根节点小的话,则最低公共祖先在左子树中。/*struct TreeNode { int val; s...原创 2018-06-14 15:53:41 · 402 阅读 · 0 评论 -
二叉树应用_二叉树的下一个节点
题目:给定一个二叉树和其中的一个节点,找出中序遍历的下一个节点。树中的节点除了有指向左右节点的两个指针之外,还有一个指向父节点的指针。 分析:对于这个问题分情况讨论,1、如果一个节点有右子树,那么它中序遍历的下一个节点就是它的右子树的最左子节点。2、如果一个节点没有右子树,并且是他父节点的左子节点,那么他的父节点就是中序遍历中的下一个节点。3、如果一个节点既没有右子树,并且他还是父节点的右子节点...原创 2018-06-14 16:23:26 · 259 阅读 · 0 评论 -
字符串的排列与组合
字符串的全排列 题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 分析:对于这个问题可以把字符串分成两个部分,一部分是字符串的第一个字符,另一部分是剩余部分。即就是两个步骤,1:求后面n-1个字符的全排列;2、把第一个字符与后面字符分别交换。而求后面n-1个字符的...原创 2018-07-04 15:13:08 · 322 阅读 · 0 评论