
C++_题解
可存放个人注意点与程序思路。
Regeon Chen
只会写题解的蒟蒻
展开
-
manacher——字符串连接(原BZOJ3790)
题面你可以生成所有形式的回文串,你可以把两个字符串连接起来得到一个新字符串,如果一个字符串的后缀和一个字符串的前缀是完全相同的,那么可以将这个重复部分重叠(也可以不重叠)。例如:aba 和 aca 连接起来,可以生成串 abaaca 或 abaca。现在给出一个字符串,询问你至少需要连接多少次才能得到这个字符串。...原创 2021-04-05 20:51:37 · 273 阅读 · 0 评论 -
leetcode_687. 最长同值路径(C++)
题目原题链接给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。**注意:**两个节点之间的路径长度由它们之间的边数表示。示例 1:输入: 5 / \ 4 5 / \ \ 1 1 5输出:2示例 2:输入: 1 ...原创 2020-05-08 21:28:38 · 199 阅读 · 0 评论 -
leetcode_501. 二叉搜索树中的众数(C++)
题目原题链接给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树例如:给定 BST [1,null,2,2], 1 \ 2 / 2返回[2].提示: 如果...原创 2020-05-06 22:07:19 · 274 阅读 · 0 评论 -
leetcode_1022.从根到叶的二进制数之和(C++,用递归来遍历)
题目原题链接给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。以 10^9 + 7 为模,返回这些数字之和。思路其实这题的思路很简...原创 2020-05-05 16:57:02 · 172 阅读 · 0 评论 -
leetcode_669. 修剪二叉搜索树(C++,6行递归)
题目原题链接给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。示例 1:输入: 1 / \ 0 2 L = 1 R = 2输出: 1 \ 2示例 2:输入:...原创 2020-05-05 15:40:30 · 193 阅读 · 0 评论 -
leetcode_993. 二叉树的堂兄弟节点(C++,广搜)
题目原题链接在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。思路首先思考,堂兄弟节点要满足什么条件呢?...原创 2020-05-05 11:33:57 · 285 阅读 · 0 评论 -
leetcode_606. 根据二叉树创建字符串(C++,递归实现)
题目原题链接你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。示例 1:输入: 二叉树: [1,2,3,4] 1 / \ 2 3 / 4 输出: "1(2(4))(3)"解释:...原创 2020-05-05 09:34:37 · 291 阅读 · 0 评论 -
leetcode_653. 两数之和 IV - 输入 BST(C++,中序遍历+二分查找)
题目原题链接给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。案例 1:输入: 5 / \ 3 6 / \ \2 4 7Target = 9输出: True案例 2:输入: 5 / \ 3 6 / \ \2 4 7Target = 2...原创 2020-05-04 22:50:27 · 211 阅读 · 0 评论 -
leetcode_538. 把二叉搜索树转换为累加树(C++,不正常的中序遍历)
题目原题链接给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。例如:输入: 原始二叉搜索树: 5 / \ 2 13输出: 转换为累加树: 18 ...原创 2020-05-04 11:30:53 · 125 阅读 · 0 评论 -
leetcode_897. 递增顺序查找树(C++,中序遍历)
题目原题链接给你一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。示例 :输入:[5,3,6,2,4,null,8,1,null,null,null,7,9] 5 / \ 3 6 / \ \ 2 4 8 / / \ 1 7 ...原创 2020-05-04 10:24:56 · 302 阅读 · 0 评论 -
leetcode_95. 不同的二叉搜索树 II(C++,枚举法)
题目原题链接给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。示例:输入: 3输出:[ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3]]解释:以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 ...原创 2020-05-04 09:11:01 · 222 阅读 · 0 评论 -
leetcode_96. 不同的二叉搜索树(C++,DP双百解法)
题目原题链接给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2...原创 2020-05-03 09:52:51 · 160 阅读 · 0 评论 -
leetcode_894. 所有可能的满二叉树(C++,详细讲解)
题目原题链接满二叉树是一类二叉树,其中每个结点恰好有 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...原创 2020-05-02 20:06:01 · 410 阅读 · 0 评论 -
leetcode_701. 二叉搜索树中的插入操作(C++)
题目原题链接给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 保证原始二叉搜索树中不存在新值。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。例如,给定二叉搜索树: 4 / \ 2 7 / \1 3和 插入的值: 5你可以返回这个二叉搜索树: ...原创 2020-05-02 09:38:05 · 294 阅读 · 0 评论 -
leetcode_654. 最大二叉树(C++)
题目原题链接给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。示例 :输入:[3,2,1,6,0,5]输出:返回下面这棵树的根节点: 6 / \...原创 2020-05-01 11:51:49 · 372 阅读 · 0 评论 -
leetcode_814. 二叉树剪枝(C++,双百解法)
题目原题链接给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。返回移除了所有不包含 1 的子树的原二叉树。( 节点 X 的子树为 X 本身,以及所有 X 的后代。)示例1:输入: [1,null,0,0,1]输出: [1,null,0,null,1] 解释: 只有红色节点满足条件“所有不包含 1 的子树”。右图为返回的答案。示例2:输入: [1,...原创 2020-04-30 21:34:00 · 219 阅读 · 0 评论 -
leetcode_199. 二叉树的右视图(C++,层序遍历)
题目原题链接给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 <--- / \2 3 <--- \ \ 5 4 <---思路这题一眼看...原创 2020-04-28 21:16:02 · 141 阅读 · 0 评论 -
(附带讲解upper_bound函数)NOI Online#2 T1未了endless(C++,贪心+二分)
由于触犯天神,Sisyphus 将要接受惩罚。宙斯命 Sisyphus 推一块巨石上长度为 LL 的山坡。Sisyphus 匀速向上推的速度为每年 vv 的长度(由于是匀速,故经过 \frac{1}{2}21 年将能向上推 \frac{v}{2}2v 的长度)。然而,宙斯并不希望 Sisyphus 太快到达山顶。宙斯可以施展 nn 个魔法,若宙斯施展第 ii 个魔法 (1\l...原创 2020-04-27 22:04:11 · 335 阅读 · 0 评论 -
leetcode_117.填充每个节点的下一个右侧节点指针II(C++,递归思路)
题目原题链接给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。使用...原创 2020-04-26 22:30:38 · 265 阅读 · 0 评论 -
leetcode_116.填充每个节点的下一个右侧节点指针(C++,三行核心代码)
题目原题链接给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 nex...原创 2020-04-25 10:16:57 · 306 阅读 · 0 评论 -
leetcode_114.二叉树展开为链表(C++,图解非递归原地算法)
题目给定一个二叉树,原地将它展开为链表。例如,给定二叉树 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6思路我们取根节点作递归使用,每次对根节点进行操作,然后根节点指向它的右孩子,操作如下...原创 2020-04-23 22:40:34 · 173 阅读 · 0 评论 -
leetcode_98.验证二叉搜索树(厚颜无耻地用上了C++指针)
题目原题链接给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4 / \ 3...原创 2020-04-21 23:33:47 · 115 阅读 · 0 评论 -
leetcode_103.二叉树的锯齿形层次遍历(C++,reverse函数)
参考文献:revers函数源码解析(侵删侵删侵删,重要的事情说三遍)题目原题链接给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回锯齿形层次遍历如下:[ [3]...原创 2020-04-20 22:55:51 · 358 阅读 · 0 评论 -
leetcode_637. 二叉树的层平均值(C++,队列实现)
题目给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.示例 1:输入: 3 / \ 9 20 / \ 15 7输出: [3, 14.5, 11]解释:第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].注意:节点值的范围在32位有符号整数范围内。思路解释:题目中的 32位有...原创 2020-04-20 21:35:15 · 459 阅读 · 0 评论 -
leetcode_107. 二叉树的层次遍历 II(C++,队列辅助实现)
题目原题链接给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其自底向上的层次遍历为:[ [15,7], [9,20], [3]]思路我们先思考一下,这道题最...原创 2020-04-19 09:44:11 · 225 阅读 · 0 评论 -
leetcode_102. 二叉树的层序遍历(C++,前序遍历)
题目给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]思路该题我们采用前序遍历的思路又因为题目要求每层的节点返回一个一...原创 2020-04-18 23:10:14 · 477 阅读 · 0 评论 -
leetcode_111.二叉树的最小深度(DFS & 易错点讲解)
题目给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2.思路一个很简单的思路,除非该点为空,否则返回左右孩子中的较小值。/** * D...原创 2020-04-18 16:55:17 · 191 阅读 · 0 评论 -
leetcode_129. 求根到叶子节点数字之和(DFS 100%)
题目原题链接给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 25解释:从根到叶子节点路径 1->...原创 2020-04-18 11:50:20 · 171 阅读 · 0 评论 -
leetcode_1372.二叉树中的最长交错路径(DFS)
题目原题链接给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下:选择二叉树中 任意 节点和一个方向(左或者右)。如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。改变前进方向:左变右或者右变左。重复第二步和第三步,直到你在树中无法继续移动。交错路径的长度定义为:访问过的节点数目 - 1(单个节点的路径长度为 0 )。请你返回给定树中最长 交错...原创 2020-04-18 11:08:54 · 291 阅读 · 0 评论 -
leetcode_437.路径总和III(暴搜?或许吧)
题目原题链接给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。示例:root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = ...原创 2020-04-12 12:45:01 · 137 阅读 · 0 评论 -
leetcode_404.左叶子之和(两种思路:递归&非递归)
题目原题链接计算给定二叉树的所有左叶子之和。示例: 3 / \ 9 20 / \ 15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24思路该题细节较多,有些看似不重要的特判语句,不加则会导致程序不够严谨,致使答案或编译出错,以下代码注释中有写“不加会出错”的就是这类语句。/** * Definition for a ...原创 2020-04-11 11:53:51 · 188 阅读 · 0 评论 -
leetcode_257.二叉树的所有路径(递归&字符串)
题目原题链接给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3思路首先,定义一个递归函数,该函数有两个参数,一个是当前节点...原创 2020-04-11 09:47:21 · 140 阅读 · 0 评论 -
leetcode_226. 翻转二叉树(swap函数,递归思路)
题目原题链接翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1思路什么是翻转二叉树?简单点说……就是将左右子树调换位置,但是需要注意的是,左右子树的左右子树也需要调换位置,什么意思呢?可能有点绕……...原创 2020-04-07 23:22:38 · 408 阅读 · 0 评论 -
leetcode_110.平衡二叉树(自顶向下的递归解法)
这两段代码摘自代码中,可以说,都是该题的核心代码。它们有什么共同点呢?可以说该题的所有递归,都是向左右子树完成的。return abs(height(root->left) - height(root->right)) < 2 && isBalanced(root->left) && isBalanced(root->right);return 1 + max(height(root->left), height(root->right));原创 2020-04-05 22:52:07 · 185 阅读 · 0 评论 -
leetcode_104.二叉树的最大深度(递归式)
题目给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。思路首先,深度是什么?你可以理解为,一棵树的深度就是根节点到离它最远的叶子节点的...原创 2020-04-05 09:56:55 · 108 阅读 · 0 评论 -
leetcode_101.对称二叉树(递归思路)
题目给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3说明:如果你可以运用递归和迭代两种方法解决这个问题...原创 2020-04-01 23:39:37 · 308 阅读 · 0 评论 -
leetcode_100.相同的树
题目给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3]输出: true示例 2:输入: 1 ...原创 2020-03-31 23:15:37 · 85 阅读 · 0 评论 -
leetcode_334.递增的三元子序列
给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。数学表达式如下:如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。说明: 要求算法的时间复杂度为 O(...原创 2020-03-29 17:14:44 · 1019 阅读 · 1 评论 -
leetcode_300. 最长上升子序列
题目给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n^2) 。思路定义 dp[i]表示前 i 个元素中,以第 i 个数字结尾的最长上...原创 2020-03-22 15:46:36 · 211 阅读 · 0 评论 -
leetcode_64. 最小路径和
题目给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。思路具体递推式很好想,具体为:dp[i][j] += min(dp[i-1][j], dp[i...原创 2020-03-22 09:53:38 · 429 阅读 · 0 评论