递归
递归类算法题
菜鸡的鼻祖
这个作者很懒,什么都没留下…
展开
-
剑指Offer(第2版)——面试题38:字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a, b, c所能排列出来的所有字符串abc, acb, bac, bca, cab和cba。解题思路:我们把一个字符串看成由两部分组成:第一部分是它的第一个字符,第二部分是后面的所有字符。求整个字符串的排列,可以看成两步:第一步求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。下图...原创 2019-12-02 10:21:33 · 99 阅读 · 0 评论 -
剑指Offer(第2版)——面试题19:正则表达式匹配
题目:请实现一个函数用来匹配包括“ . ”和“ * ”的正则表达式。模式中的字符“ . ”表示任意一个字符,而“ * ”表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab * ac * a"匹配,但是与"aa.a"和"ab*a"均不匹配。1.解题思路:字符“.”可以表示任意的字符 ,字符“ * ”表示...原创 2019-08-06 22:28:56 · 200 阅读 · 0 评论 -
剑指Offer(第2版)——面试题54:二叉搜索树的第k大节点
题目给定一颗二叉搜索树,请找出其中的第k大的节点。例如,在下图二叉搜索树里,按节点数值大小顺序,第三大节点的值为4。解题思路这棵树是二叉搜索树,首先想到的是二叉搜索树的一个特点:左子节点的值 < 根节点的值 < 右子节点的值。如果按照中序遍历的顺序遍历一棵二叉搜索树,则遍历序列的数值是递增排序的。如上图所示,如果使用中序遍历,则得到的序列是{2,3,4,5,6,7,8}。...原创 2020-01-14 12:43:27 · 135 阅读 · 0 评论 -
剑指Offer(第2版)——面试题36:二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。原创 2019-09-19 21:57:14 · 194 阅读 · 0 评论 -
剑指Offer(第2版)——面试题33:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。二叉搜索树定义:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。...原创 2019-09-07 22:01:31 · 191 阅读 · 0 评论 -
剑指Offer(第2版)——面试题55:二叉树的深度
标题输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。解题思路可以用递归的方法实现,我们假设已经正确拿到了root节点左右子树的最大深度,那么最后加一即可:如果一棵树只有一个节点,那么它的深度为1;如果根节点只有左子树而没有右子树,那么树的深度应该是其左子树的深度加1;如果根节点只有右子树而没有左子树,那么...原创 2020-01-15 11:49:30 · 128 阅读 · 0 评论 -
剑指Offer(第2版)——面试题37:序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树。1.解题思路:根据前序遍历的顺序来序列化和反序列化二叉树。在遍历二叉树碰到NULL指针时,可以用$符号表示;节点之间可以用逗号隔开。2.代码:...原创 2019-11-29 15:25:34 · 204 阅读 · 0 评论 -
剑指Offer(第2版)——面试题34:二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。路径定义为从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。1.解题思路:用前序遍历的方式访问到某一个节点时,我们把该节点添加到路径上,并累加该节点的值;如果该节点为叶节点,并且路径中节点值的和刚好等于输入的整数,则当前路径符合要求;如果当前节点不是叶节点,则继续访问它的子节点;当前节点访问结束时,...原创 2019-09-08 22:34:34 · 105 阅读 · 0 评论 -
剑指Offer(第2版)——面试题28:对称的二叉树
题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。1.解题思路:前序遍历算法:先访问根节点,再访问左子节点,最后访问右子节点。对称前序遍历算法:先访问根节点,再访问右子节点,最后访问左子节点。如果二叉树的前序遍历序列和对称前序遍历序列是一样的,则说明二叉树是对称的。举例:遍历第一棵树,前序遍历的遍历序列为{8,6,5,7,6,7,...原创 2019-08-29 22:27:46 · 126 阅读 · 0 评论 -
剑指Offer(第2版)——面试题27:二叉树的镜像
题目:请完成一个函数,输入一棵二叉树,该函数输出它的镜像。1.解题思路:先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换玩所有非叶节点的左,右子节点之后,就得到了树的镜像。举例:观察到两棵树的根节点相同,但其左右子节点交换了位置,所以首先交换根节点的两个子节点;我们注意到值为10、6节点的子节点仍然保持不变,因此我们还需要交换这两个节点的左右...原创 2019-08-27 20:29:44 · 105 阅读 · 0 评论 -
剑指Offer(第2版)——面试题26:树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。1.解题思路:第一步:在树A中找到和B的根节点的值一样的节点R;第二步:判断树A中以R为根节点的子树是不是包含和树B一样的结构;可以使用递归的方法;要注意空指针的处理。2.代码:...原创 2019-08-27 18:08:48 · 87 阅读 · 0 评论 -
剑指Offer(第2版)——面试题7:重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。1.解题思路:知识点: 通常树有如下几种遍历方式: 前序序列:先访问根节点,再访问左子节点,最后访问右子节点。 中序序列:先访问左子节点,...原创 2019-06-16 21:39:09 · 114 阅读 · 0 评论 -
剑指Offer(第2版)——面试题25:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。1.解题思路:鲁棒性问题:首先判断输入的链表是否为空的指针。如果第一个链表为空,则直接返回第二个链表;如果第二个链表为空,则直接返回第一个链表;如果两个链表都是空链表,则合并的结果是得到一个空链表。合并过程:两个链表都是排序好的,只需要从头遍历链表,判断当前指针,哪个链表中的值小,即赋给合并链表指针即可,使用...原创 2019-08-25 22:15:28 · 97 阅读 · 0 评论 -
剑指Offer(第2版)——面试题24:反转链表
题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。链表节点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};1.解题思路:...原创 2019-08-25 17:32:11 · 148 阅读 · 0 评论 -
剑指Offer(第2版)——面试题18:删除链表中重复的节点
题目:在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。1.解题思路:三指针法:删除重复节点,只需要记录当前节点之前的最晚访问过的不重复节点pPre、当前节点pCur、指向当前节点之后节点pNext的三个指针即可。如...原创 2019-08-14 18:06:14 · 123 阅读 · 0 评论 -
剑指Offer(第2版)——面试题6:反转链表
题目:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL解题思路:初始化:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode...原创 2019-06-16 11:24:29 · 148 阅读 · 0 评论 -
剑指Offer(第2版)——面试题51:数组中的逆序对
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6,4)和(5,4)。解题思路思路1:暴力法 顺序扫描整个数组,每扫描到一个数字,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数字就组成一个逆...原创 2019-12-24 22:12:59 · 137 阅读 · 0 评论