递归
hestyle
戎码一生!
展开
-
LeetCode 两两交换链表中的节点(递归)
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.说明:你的算法只能使用常数的额外空间。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。思路分析:最容易想到的解题思路当然是每两个进行交换,主要涉及到的就是指针的移动、交换问题。此种算法并不复杂,但是要有较为清晰...原创 2019-01-25 12:03:12 · 384 阅读 · 0 评论 -
LeetCode N叉树的后序遍历(递归、递推)
给定一个 N 叉树,返回其节点值的后序遍历。例如,给定一个 3叉树 :返回其后序遍历: [5,6,3,2,4,1].说明: 递归法很简单,你可以使用迭代法完成此题吗?思路分析: N叉树的后序遍历与二叉树的后序遍历思路一样,先访问子节点,再访问根节点。请先翻阅 LeetCode 二叉树的后序遍历(递归、递推)方法一:递归法。/*// Definition for a Node.c...原创 2019-04-14 15:39:05 · 851 阅读 · 0 评论 -
LeetCode 最长同值路径(图解)
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。示例 1:输入: 5 / \ 4 5 / \ \ 1 1 5输出:2示例 2:输入: ...原创 2019-04-22 20:09:09 · 2477 阅读 · 2 评论 -
LeetCode 最大二叉树(分治递归)
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。Example 1:输入: [3,2,1,6,0,5]输入: 返回下面这棵树的根节点: 6 / \ ...原创 2019-04-18 10:10:03 · 333 阅读 · 0 评论 -
LeetCode 输出二叉树(图解规律+分治法)
在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则:行数 m 应当等于给定二叉树的高度。列数 n 应当总是奇数。根节点的值(以字符串格式给出)应当放在可放置的第一行正中间。根节点所在的行与列会将剩余空间划分为两部分(左下部分和右下部分)。你应该将左子树输出在左下部分,右子树输出在右下部分。左下和右下部分应当有相同的大小。即使一个子树为空而另一个非空,你不需要为空的子树输出任何东西,...原创 2019-04-18 10:56:12 · 527 阅读 · 0 评论 -
LeetCode Lisp语法解析(细节处理)
给定一个类似 Lisp 语句的表达式 expression,求出其计算结果。表达式语法如下所示:表达式可以为整数,let 语法,add 语法,mult 语法。表达式的结果总是一个整数。(整数可以是正整数、负整数、0)let 语法表示为 (let v1 e1 v2 e2 … vn en expr), 其中 let语法总是以字符串"let"来表示,接下来会跟随一个或多个交替变量或表达式,也就...原创 2019-05-01 17:54:39 · 1146 阅读 · 0 评论 -
LeetCode 二叉树最大深度(递归)
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。示例 1:输入: 1 / \ 3 2 / \...原创 2019-04-18 16:13:34 · 525 阅读 · 0 评论 -
LeetCode 修剪二叉搜索树(递归)
给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。示例 1:输入: 1 / \ 0 2 L = 1 R = 2输出: 1 \ 2示例 2:输入: 3 ...原创 2019-04-19 14:30:53 · 304 阅读 · 0 评论 -
LeetCode 二叉树剪枝(递归)
给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。返回移除了所有不包含 1 的子树的原二叉树。( 节点 X 的子树为 X 本身,以及所有 X 的后代。)示例1:输入: [1,null,0,0,1]输出: [1,null,0,null,1]解释: 只有红色节点满足条件“所有不包含 1 的子树”。右图为返回的答案。示例2:输入: [1,0,1,0,0,0...原创 2019-05-19 11:05:35 · 629 阅读 · 0 评论 -
LeetCode 第K个语法符号(递归+找规律)
在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始)例子:输入: N = 1, K = 1输出: 0输入: N = 2, K = 1输出: 0输入: N = 2, K = 2输出: 1输入: N = 4, K = 5输出: 1解释:第一行: 0第二行: 01第三行...原创 2019-05-10 16:10:18 · 6278 阅读 · 0 评论 -
LeetCode 二叉搜索树结点最小距离(中序遍历)
给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值。示例:输入: root = [4,2,6,1,3,null,null]输出: 1解释:注意,root是树结点对象(TreeNode object),而不是数组。给定的树 [4,2,6,1,3,null,null] 可表示为下图: 4 / \ 2 6 ...原创 2019-05-11 10:03:56 · 1027 阅读 · 0 评论 -
LeetCode 打砖块(逆向思维)
我们有一组包含1和0的网格;其中1表示砖块。 当且仅当一块砖直接连接到网格的顶部,或者它至少有一块相邻(4 个方向之一)砖块不会掉落时,它才不会落下。我们会依次消除一些砖块。每当我们消除 (i, j) 位置时, 对应位置的砖块(若存在)会消失,然后其他的砖块可能因为这个消除而落下。返回一个数组表示每次消除操作对应落下的砖块数目。示例 1:输入:grid = [[1,0,0,0],[1,1...原创 2019-05-17 11:22:41 · 699 阅读 · 0 评论 -
LeetCode 二叉树中所有距离为K的节点(后序遍历+深度优先遍历)
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2输出:[7,4,1]解释:所求结点为与目标结点(值为 5)距离为 2 的结点...原创 2019-06-08 11:07:21 · 1019 阅读 · 0 评论 -
LeetCode 具有所有最深节点的最小子树(递归)
给定一个根为 root 的二叉树,每个结点的深度是它到根的最短距离。如果一个结点在整个树的任意结点之间具有最大的深度,则该结点是最深的。一个结点的子树是该结点加上它的所有后代的集合。返回能满足“以该结点为根的子树中包含所有最深的结点”这一条件的具有最大深度的结点。示例:输入:[3,5,1,6,2,0,8,null,null,7,4]输出:[2,7,4]解释:我们返回值为 2 的...原创 2019-06-08 19:23:20 · 889 阅读 · 0 评论 -
LeetCode 根据前序和后序遍历构造二叉树(递归+图解)
返回与给定的前序和后序遍历匹配的任何二叉树。pre 和 post 遍历中的值是不同的正整数。示例:输入:pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]输出:[1,2,3,4,5,6,7]提示:1 <= pre.length == post.length <= 30pre[] 和 post[] 都是 1, 2, ..., pre...原创 2019-06-15 10:47:10 · 4521 阅读 · 0 评论 -
LeetCode 叶子相似的树(中序遍历)
请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。举个例子,如上图所示,给定一颗叶值序列为 (6, 7, 4, 9, 8) 的树。如果有两颗二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。如果给定的两个头结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。提示:给定的两颗树可能会有 1 到 100...原创 2019-06-10 16:12:03 · 214 阅读 · 0 评论 -
LeetCode 括号的分数(递归)
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:() 得 1 分。AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。(A) 得 2 * A 分,其中 A 是平衡括号字符串。示例 1:输入: "()"输出: 1示例 2:输入: "(())"输出: 2示例 3:输入: "()()"输出: 2示例 4:输入: "(()(()))"输出: 6提...原创 2019-06-04 16:31:27 · 691 阅读 · 0 评论 -
LeetCode 所有可能的满二叉树(递归)
满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点。返回包含 N 个结点的所有可能满二叉树的列表。 答案的每个元素都是一个可能树的根结点。答案中每个树的每个结点都必须有 node.val=0。你可以按任何顺序返回树的最终列表。示例:输入:7输出:[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0...原创 2019-06-16 11:03:16 · 903 阅读 · 0 评论 -
LeetCode N叉树的前序遍历(递归、递推)
给定一个 N 叉树,返回其节点值的前序遍历。例如,给定一个 3叉树 :返回其前序遍历: [1,3,5,6,2,4]。说明: 递归法很简单,你可以使用迭代法完成此题吗?思路分析: 和二叉树的前序遍历思想一致,先访问根节点,在访问子节点。请先翻阅 LeetCode 二叉树的前序遍历(递归、递推)/*// Definition for a Node.class Node {publi...原创 2019-04-14 15:17:59 · 406 阅读 · 0 评论 -
LeetCode 二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 保证原始二叉搜索树中不存在新值。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。例如,给定二叉搜索树: 4 / \ 2 7 / \ 1 3和 插入的值: 5你可以返回...原创 2019-04-25 22:39:00 · 554 阅读 · 0 评论 -
LeetCode 二叉树的平均值(递归、层序遍历)
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.示例 1:输入: 3 / \ 9 20 / \ 15 7输出: [3, 14.5, 11]解释:第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].注意:节点值的范围在32位有符号整数范围内。思路分析: 我们可以采用先序遍历,得到每...原创 2019-04-16 17:37:01 · 774 阅读 · 0 评论 -
LeetCode k个一组翻转链表(辅助栈)
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。示例 :给定这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1-&g...原创 2019-01-25 13:52:24 · 350 阅读 · 0 评论 -
LeetCode 正则表达式的匹配
给定一个字符串 (s) 和一个字符模式 §。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符。‘*’ 匹配零个或多个前面的元素。匹配应该覆盖整个字符串 (s) ,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例 1: 输入: s = "aa" p = "a" ...原创 2019-02-09 11:03:26 · 448 阅读 · 0 评论 -
LeetCode 出现次数最多的子树元素和(hash表)
给出二叉树的根,找出出现次数最多的子树元素和。一个结点的子树元素和定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。然后求出出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的元素(不限顺序)。示例 1输入: 5 / \2 -3返回 [2, -3, 4],所有的值均只出现一次,以任意顺序返回所有值。示例 2输入: 5 / \...原创 2019-04-06 14:37:19 · 382 阅读 · 0 评论 -
LeetCode 斐波拉契数(递推、递归)
斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.给定 N,计算 F(N)。示例 1:输入:2输出:1解释:F(2) = F(1) + F(0) = 1 + 0 = 1.示...原创 2019-04-06 15:28:47 · 346 阅读 · 0 评论 -
LeetCode 找树左下角的值
给定一个二叉树,在树的最后一行找到最左边的值。示例 1:输入: 2 / \ 1 3输出:1示例 2:输入: 1 / \ 2 3 / / \ 4 5 6 / 7输出:7注意: 您可以假设树(即给定的根节点)不为 NULL。思路分析: 请先翻阅 Leet...原创 2019-04-06 15:57:06 · 342 阅读 · 0 评论 -
LeetCode 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。示例 :给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之...原创 2019-04-10 19:48:39 · 298 阅读 · 0 评论 -
LeetCode 每个树行中找最大值(层次遍历、后序遍历)
您需要在二叉树的每一行中找到最大的值。示例:输入: 1 / \ 3 2 / \ \ 5 3 9 输出: [1, 3, 9]思路分析: 请先翻阅 LeetCode 二叉树的层次遍历采用层次遍历,从上至下,按层进行访问,每次寻找当前层的最大值。/** * Definition for ...原创 2019-04-07 08:50:58 · 786 阅读 · 0 评论 -
LeetCode 根据二叉树创建字符串(递归)
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。示例 1:输入: 二叉树: [1,2,3,4] 1 / \ 2 3 / 4 输出: "1(2(4))(3)"解释: 原本将是“1(2...原创 2019-04-15 17:30:56 · 632 阅读 · 0 评论 -
LeetCode 合并二叉树(递归)
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例 1:输入: Tree 1 Tree 2 1 ...原创 2019-04-15 19:34:49 · 411 阅读 · 0 评论 -
LeetCode 二叉搜索树的最小绝对值(中序遍历)
给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值。示例 :输入: 1 \ 3 / 2输出:1解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。注意: 树中至少有2个节点。思路分析: 首先我们需要知道二叉搜索树的特点:左子树每个节点值都小于root,右子树每一个节点值都大于root(并且左...原创 2019-04-09 10:35:52 · 613 阅读 · 0 评论 -
LeetCode 把二叉搜索树转换为累加树(逆中序遍历)
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。例如:输入: 二叉搜索树: 5 / \ 2 13输出: 转换为累加树: 18 / \ ...原创 2019-04-09 14:48:08 · 443 阅读 · 0 评论 -
LeetCode 四叉树交集
四叉树是一种树数据,其中每个结点恰好有四个子结点:topLeft、topRight、bottomLeft 和 bottomRight。四叉树通常被用来划分一个二维空间,递归地将其细分为四个象限或区域。我们希望在四叉树中存储 True/False 信息。四叉树用来表示 N * N 的布尔网格。对于每个结点, 它将被等分成四个孩子结点直到这个区域内的值都是相同的。每个节点都有另外两个布尔属性:isL...原创 2019-04-12 18:03:01 · 377 阅读 · 0 评论 -
LeetCode N叉树的深度
给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。例如,给定一个 3叉树 :我们应返回其最大深度,3。说明:树的深度不会超过 1000。树的节点总不会超过 5000。思路分析: 树最大深度 == (最大的子树深度) + 1./*// Definition for a Node.class Node {public: int...原创 2019-04-12 19:15:20 · 237 阅读 · 0 评论 -
LeetCode 在二叉树中增加一行(递归、辅助队列)
给定一个二叉树,根节点为第1层,深度为 1。在其第 d 层追加一行值为 v 的节点。添加规则:给定一个深度值 d (正整数),针对深度为 d-1 层的每一非空节点 N,为 N 创建两个值为 v 的左子树和右子树。将 N 原先的左子树,连接为新节点 v 的左子树;将 N 原先的右子树,连接为新节点 v 的右子树。如果 d 的值为 1,深度 d - 1 不存在,则创建一个新的根节点 v,原先的整...原创 2019-04-16 09:21:51 · 309 阅读 · 0 评论 -
LeetCode 二叉树的坡度
给定一个二叉树,计算整个树的坡度。一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。整个树的坡度就是其所有节点的坡度之和。示例:输入: 1 / \ 2 3输出: 1解释: 结点的坡度 2 : 0结点的坡度 3 : 0结点的坡度 1 : |2-3| = 1树的坡度 : 0 ...原创 2019-04-13 09:00:36 · 304 阅读 · 0 评论 -
LeetCode 键值映射(前缀树)
实现一个 MapSum 类里的两个方法,insert 和 sum。对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。示例 1:输入: insert("apple", 3), 输出: Null输入: sum("...原创 2019-04-20 18:51:17 · 983 阅读 · 0 评论 -
LeetCode 另一个树的子树
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。示例 1:给定的树 s: 3 / \ 4 5 / \ 1 2给定的树 t: 4 / \ 1 2返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值...原创 2019-04-13 14:32:32 · 356 阅读 · 0 评论 -
LeetCode 递增顺序查找树(中序遍历)
给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。示例 :输入:[5,3,6,2,4,null,8,1,null,null,null,7,9] 5 / \ 3 6 / \ \ 2 4 8 / / \ 1 7 9输出:[1,nul...原创 2019-06-17 19:01:15 · 447 阅读 · 0 评论