
树、图
c++
Crystal_Coding
这个作者很懒,什么都没留下…
展开
-
leetcode222. 完全二叉树的节点个数
文章目录题目:222. 完全二叉树的节点个数基本思想1:层次遍历(bfs)基本思想2:二分查找+位运算题目:222. 完全二叉树的节点个数给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例:输入: 1 / \ 2 3 / \ /4 5 6输出: 6来源:力扣(L原创 2020-11-24 10:31:19 · 327 阅读 · 0 评论 -
leetcode701. 二叉搜索树中的插入操作/中序遍历,直接插入
文章目录题目:701. 二叉搜索树中的插入操作基本思想1:中序遍历基本思想2:直接寻找节点插入的位置题目:701. 二叉搜索树中的插入操作给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。例如:给定二叉搜索树: 4 / \ 2 7 /原创 2020-09-30 18:49:07 · 225 阅读 · 0 评论 -
leetcode117. 填充每个节点的下一个右侧节点指针 II/层次遍历
文章目录题目:117. 填充每个节点的下一个右侧节点指针 II基本思想1:层次遍历基本思想2:层次遍历(进阶)题目:117. 填充每个节点的下一个右侧节点指针 II给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。进原创 2020-09-28 20:29:33 · 160 阅读 · 0 评论 -
leetcode106. 从中序与后序遍历序列构造二叉树/递归
文章目录题目:106. 从中序与后序遍历序列构造二叉树基本思想:递归构建题目:106. 从中序与后序遍历序列构造二叉树根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如:给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7来源:力扣(LeetCode)链接:https://leetcod原创 2020-09-25 19:43:49 · 270 阅读 · 0 评论 -
leetcode501. 二叉搜索树中的众数
文章目录题目:501. 二叉搜索树中的众数基本思想1:dfs+map统计次数基本思想2:中序遍历题目:501. 二叉搜索树中的众数给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树例如:给定 BST [1,null,2,2], 1 \ 2 / 2返回[2].提示:原创 2020-09-24 20:48:43 · 483 阅读 · 0 评论 -
leetcode538. 把二叉搜索树转换为累加树/中序遍历
文章目录题目:538. 把二叉搜索树转换为累加树基本思想:中序遍历逆序中序遍历:右根左的形式题目:538. 把二叉搜索树转换为累加树给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。例如:输入: 原始二叉搜索树: 5 / \ 2 13输出: 转换为累加树: 18原创 2020-09-21 21:05:01 · 141 阅读 · 0 评论 -
leetcode637. 二叉树的层平均值/层次遍历
文章目录题目:637. 二叉树的层平均值基本思想:层次遍历题目:637. 二叉树的层平均值给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。示例 1:输入: 3 / \ 9 20 / \ 15 7输出:[3, 14.5, 11]解释:第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。 提示:节点值的范围在32位有符号整数范围内。来源:力扣(LeetCode)链接:ht原创 2020-09-12 15:45:56 · 167 阅读 · 0 评论 -
leetcode257. 二叉树的所有路径/bfs,dfs
文章目录题目:257. 二叉树的所有路径基本思想:dfs基本思想2:bfs题目:257. 二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3来源:力扣(LeetCode)链接:https://leetcode-cn.c原创 2020-09-04 17:21:23 · 350 阅读 · 0 评论 -
leetcode841. 钥匙和房间/图的遍历:dfs,栈
有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,…,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,…,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。最初,除 ...原创 2020-04-26 18:37:51 · 278 阅读 · 0 评论 -
leetcode109. 有序链表转换二叉搜索树/先序遍历递归构建
文章目录题目:109. 有序链表转换二叉搜索树基本思想:先序遍历递归构建题目:109. 有序链表转换二叉搜索树给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9原创 2020-08-18 15:16:33 · 178 阅读 · 0 评论 -
leetcode130. 被围绕的区域/dfs,bfs
文章目录题目:130. 被围绕的区域基本思想:dfs题目:130. 被围绕的区域给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与原创 2020-08-11 10:07:56 · 286 阅读 · 0 评论 -
leetcode207. 课程表/拓扑排序,dfs,bfs
文章目录题目:207. 课程表基本思想1:bfs题目:207. 课程表你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]] 输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。示原创 2020-06-30 17:25:47 · 251 阅读 · 0 评论 -
leetcode133. 克隆图/bfs,dfs
文章目录题目:leetcode133. 克隆图基本思想:bfs题目:leetcode133. 克隆图给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。class Node { public int val; public List<Node> neighbors;} 测试用例格式:简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1原创 2020-06-27 16:37:53 · 256 阅读 · 0 评论 -
leetcode1129. 颜色交替的最短路径/单源最短路径,BFS,DFS
文章目录标题:leetcode1129. 颜色交替的最短路径基本思想1:BFS基本思想2:dfs深度分析标题:leetcode1129. 颜色交替的最短路径在一个有向图中,节点分别标记为 0, 1, …, n-1。这个图中的每条边不是红色就是蓝色,且存在自环或平行边。red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边。类似地,blue_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的蓝色有向边。返回长度为 n 的数组 answer,其中 a原创 2020-06-21 18:08:49 · 550 阅读 · 0 评论 -
leetcode1028. 从先序遍历还原二叉树/先序遍历
文章目录题目:leetcode1028. 从先序遍历还原二叉树基本思想1:先序遍历非递归形式基本思想2:先序遍历递归形式题目:leetcode1028. 从先序遍历还原二叉树我们从二叉树的根节点 root 开始进行深度优先搜索。在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。如果节点只有一个子节点,那么保证该子节点为左子节点。给出遍历输出 S,还原树并返回其根节点 roo原创 2020-06-18 16:07:55 · 357 阅读 · 0 评论 -
leetcode297. 二叉树的序列化与反序列化/层次遍历
文章目录题目:leetcode297. 二叉树的序列化与反序列化完整代码题目:leetcode297. 二叉树的序列化与反序列化序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。示例:你可以将以下二叉原创 2020-06-16 16:41:53 · 262 阅读 · 0 评论 -
leetcode126. 单词接龙 II/图,最短路径
给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回一个空列表。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例 1:输入:beginWord = "hit",原创 2020-06-08 10:09:41 · 290 阅读 · 0 评论 -
leetcode743. 网络延迟时间/单源最短路径:迪杰特斯拉,SPFA,Bellman-Ford,Floyd
有 N 个网络节点,标记为 1 到 N。给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。示例:输入:times = [[2,1,1],[2,3,1],[3,4,1]], N = 4, K = 2输出:2注意:N 的范围在 [1, 100] 之间原创 2020-06-06 09:41:40 · 401 阅读 · 0 评论 -
leetcode210. 课程表 II / 拓扑排序
现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。示例 1:输入: 2, [[1,0]] 输出: [0,1]解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1]原创 2020-05-18 10:21:43 · 267 阅读 · 0 评论 -
leetcode572. 另一个树的子树
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。示例 1:给定的树 s: 3 / \ 4 5 / \ 1 2给定的树 t: 4 / \ 1 2返回 true,因为 t 与 s 的一个子树拥有相同的结构和节...原创 2020-05-07 18:31:01 · 134 阅读 · 0 评论 -
leetcode1161. 最大层内元素和
给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。请你找出层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。示例:输入:[1,7,0,7,-8,null,null] 输出:2 解释: 第 1 层各元素之和为 1, 第 2 层各元素之和为 7 + 0 =7, 第 3 层各元素之和为 7 + -8 = -1...原创 2020-04-22 18:06:41 · 217 阅读 · 0 评论 -
leetcode199. 二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 <--- / \2 3 <--- \ \ 5 4 <---来源:力扣(LeetCode)...原创 2020-04-22 17:16:14 · 170 阅读 · 0 评论 -
leetcode226. 翻转二叉树/递归实现,非递归实现
写在前面这道题是在阿里面试时,手撕代码的题目。刚开始用递归实现了,面试官进一步要求,能否用循环的形式实现。递归实现时,递归结束的判断条件冗余(刚开始写了两个判断条件,节点为空的时候返回,节点为叶子节点的时候返回,其实没有必要对节点是叶子节点的时候进行判断)leetcode226. 翻转二叉树翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ ...原创 2020-03-19 17:23:19 · 219 阅读 · 0 评论 -
先序遍历构建二叉树 C++
#include<bits/stdc++.h>using namespace std;struct TreeNode{ struct TreeNode * lchild, *rchild; int val; TreeNode(int x): val(x), lchild(NULL), rchild(NULL){}};void create(Tree...原创 2020-03-11 10:59:58 · 2180 阅读 · 2 评论 -
leetcode543. 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。示例 :给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之间边的数目表示。来源:力扣(LeetCo...原创 2020-03-10 18:12:39 · 177 阅读 · 0 评论 -
leetcode100.相同的树/dfs
给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3]输出: true示例 2:输入: 1 ...原创 2020-02-26 11:08:27 · 165 阅读 · 0 评论 -
leetcode617.合并二叉树/dfs,层次遍历
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例 1:输入: Tree 1 Tree 2 1 ...原创 2020-02-21 10:37:59 · 178 阅读 · 0 评论 -
leetcode236.二叉树的最近公共祖先节点
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6...原创 2020-02-11 10:52:15 · 274 阅读 · 0 评论 -
leetcode235.二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2...原创 2020-02-10 16:37:25 · 405 阅读 · 0 评论 -
leetcode124.二叉树中的最大路径/先序遍历
给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 6示例 2:输入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \...原创 2020-02-03 16:53:03 · 346 阅读 · 0 评论 -
leetcode114.二叉树展开为链表/递归
给定一个二叉树,原地将它展开为链表。例如给定二叉树: 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6来源:力扣(LeetCode)链接:https://leetcode-cn.com/p...原创 2020-01-30 15:17:01 · 209 阅读 · 0 评论 -
剑指offer28.对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。完整代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), lef...原创 2020-01-15 11:06:23 · 199 阅读 · 0 评论 -
剑指offer27.二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5完整代...原创 2020-01-15 10:42:46 · 201 阅读 · 0 评论 -
剑指offer26.树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)完整代码递归说下自己解这道题的心路历程吧!其实一开始的思路并不是这样的,当时就想写一个递归,按照先序遍历的方式进行判断,写了以后发现递归着递归着就乱套了,才意识到需要两层递归来实现,好,下面就来说一下基本思路基本思路:外部递归:类似于先序遍历递归的思路,先从根节点出发来判断是不是子结构,...原创 2019-12-31 20:00:59 · 118 阅读 · 0 评论 -
剑指offer54.二叉搜索树的第k个节点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。完整代码递归基本思想:求中序遍历的第k个节点/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(...原创 2019-12-18 19:19:40 · 174 阅读 · 0 评论 -
剑指offer37.序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到...原创 2019-12-17 20:46:59 · 138 阅读 · 0 评论 -
剑指offer——二叉树的下一个节点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。完整代码求二叉树中序遍历的下一个节点基本思想:如果该节点有右孩子,那么下一个节点是其右子树最左端的节点如果该节点没有右孩子,其下一个节点是向上返回的某个根节点:该节点是左孩子,那么其根结点就是下一个节点;该节点是右孩子,那么要找到从根节点的...原创 2019-12-16 20:18:03 · 191 阅读 · 0 评论 -
剑指offer36.二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。完整代码递归基本思想:这道题的本质就是将二叉树中序线索化,指向左孩子的指针为其前驱指针,指向右孩子的指针为其后继指针。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *ri...原创 2019-12-14 18:12:18 · 99 阅读 · 0 评论 -
剑指offer33.二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。完整代码递归基本思想:借助先序遍历的思想来实现先判断根节点的情况:根节点是后序遍历的最后一个值当序列前一部分的值小于根节点的值,序列的后一部分值大于根节点的值时,当前状态下返回true,否则返回false再递归判断左右子树,这里要...原创 2019-12-14 16:47:13 · 111 阅读 · 0 评论 -
剑指offer——重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。完整代码/** * Definition for binary tree * struct TreeNode { * int val;...原创 2019-12-14 09:44:35 · 148 阅读 · 0 评论