![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二叉树
小马哥MAX
刷题记录BLOG
展开
-
【两次过】Leetcode 654.最大二叉树
给定一个不含重复元素的整数数组nums。一个以此数组直接递归构建的最大二叉树定义如下:二叉树的根是数组nums中的最大元素。 左子树是通过数组中最大值左边部分递归构造出的最大二叉树。 右子树是通过数组中最大值右边部分递归构造出的最大二叉树。返回有给定数组nums构建的最大二叉树。示例 :输入:nums = [3,2,1,6,0,5]输出:提示:1 <= nums.length <= 1000 0 <= nums[i] &...原创 2021-07-01 16:05:04 · 118 阅读 · 0 评论 -
【两次过】Leetcode 114.二叉树展开为链表
给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。 展开后的单链表应该与二叉树先序遍历顺序相同。示例 1:输入:root = [1,2,5,3,4,null,6]输出:[1,null,2,null,3,null,4,null,5,null,6]解题思路:我们尝试给出这个函数的定义:给 flatten 函数输入一个节点 root,那么以 roo...原创 2021-07-01 15:15:08 · 102 阅读 · 0 评论 -
【两次过】Leetcode 116.填充二叉树节点的右侧指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为NULL。初始状态下,所有next 指针都被设置为NULL。进阶:你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占...原创 2021-06-24 15:39:13 · 101 阅读 · 0 评论 -
【两次过】LeetCode257:二叉树的所有路径
*给定一个二叉树,返回所有从根节点到叶子节点的路径。*说明:叶子节点是指没有子节点的节点。*示例:*输入:*1*/\*23*\*5*输出:["1->2->5","1->3"]*解释:所有根节点到叶子节点的路径为:1->2->5,1->3解题思路:答案要求所有达到根结点的路径的字符串表示,这是一个典型的回溯问题。回溯在于,走到一个叶子结点,要查...原创 2020-09-03 09:51:30 · 132 阅读 · 0 评论 -
【一次过】Lintcode 73. 前序遍历和中序遍历树构造二叉树
根据前序遍历和中序遍历树构造二叉树.样例给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \1 3注意事项你可以假设树中不存在相同数值的节点解题思路: 1 / \ 2 3 / \ / \ 4 5 6 7对于上图的树来说, index: 0...原创 2018-09-06 11:32:45 · 371 阅读 · 0 评论 -
【一次过】Lintcode 72. 中序遍历和后序遍历树构造二叉树
根据中序遍历和后序遍历树构造二叉树样例给出树的中序遍历:[1,2,3]和后序遍历:[1,3,2]返回如下的树: 2/ \1 3注意事项你可以假设树中不存在相同数值的节点解题思路:类似于Lintcode 73. 前序遍历和中序遍历树构造二叉树,直接看代码/** * Definition of TreeNode: * public c...原创 2018-09-06 21:56:33 · 125 阅读 · 0 评论 -
【两次过】Lintcode 130. 堆化
给出一个整数数组,堆化操作就是把它变成一个最小堆数组。对于堆数组A,A[0]是堆的根,并对于每个A[i],A [i * 2 + 1]是A[i]的左儿子并且A[i * 2 + 2]是A[i]的右儿子。样例给出[3,2,1,4,5],返回[1,2,3,4,5]或者任何一个合法的堆数组挑战O(n)的时间复杂度完成堆化说明什么是堆?堆是一种数据结构,它通常有三种方法:p...原创 2019-03-27 09:39:23 · 132 阅读 · 0 评论 -
【两次过】Lintcode 442. 实现 Trie(前缀树)
实现一个 Trie,包含insert,search, 和startsWith这三个方法。样例样例 1:输入: insert("lintcode") search("lint") startsWith("lint")输出: false true样例 2:输入: insert("lintcode") search("code") ...原创 2019-03-28 09:31:50 · 120 阅读 · 0 评论 -
【一次过】二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路:与Lintcode 378. 将二叉查找树转换成双链表类似,不同的是这个不需要新建节点。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNo...原创 2019-05-03 09:37:03 · 163 阅读 · 0 评论 -
【两次过】Lintcode 473. 单词的添加与查找
设计一个包含下面两个操作的数据结构:addWord(word),search(word)addWord(word)会在数据结构中添加一个单词。而search(word)则支持普通的单词查询或是只包含.和a-z的简易正则表达式的查询。一个.可以代表一个任何的字母。样例样例 1:输入: addWord("a") search(".")输出: true样...原创 2019-03-28 10:16:01 · 168 阅读 · 0 评论 -
【三次过】Lintcode 87. 删除二叉查找树的节点
给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。样例给出如下二叉查找树: 5 / \ 3 6/ \2 4删除节点3之后,你可以返回: 5 / \...原创 2019-03-26 09:50:51 · 116 阅读 · 0 评论 -
【一次过】Lintcode 11:二叉查找树中搜索区间
给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点。找到树中所有值在 k1 到 k2 范围内的节点。即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找树的中的节点值。返回所有升序的节点值。样例如果有 k1 =10和 k2 =22, 你的程序应该返回[12, 20, 22]. 20 / \ 8 22 /...原创 2018-05-28 13:20:28 · 146 阅读 · 0 评论 -
【两次过】Lintcode 597. 具有最大平均数的子树
给一棵二叉树,找到有最大平均值的子树。返回子树的根结点。样例给一个二叉树: 1 / \ -5 11 / \ / \1 2 4 -2 返回节点 11。注意事项LintCode会打印出根结点为你返回节点的子树,保证有最大平均数子树只有一棵解题思路:与Lintcode 596. 最小子树思路一致,只不过求平均值所需要传递...原创 2019-02-14 12:12:47 · 491 阅读 · 1 评论 -
【一次过】Lintcode 596. 最小子树
给一棵二叉树, 找到和为最小的子树, 返回其根节点。样例例1:输入: 1 / \ -5 2 / \ / \0 2 -4 -5 输出:1例2:输入: 1输出:1注意事项LintCode会打印根节点为你返回节点的子树。保证只有一棵和最小的子树并且给出的二叉树不是一棵空树。解题思路1:采用全局变量记录最...原创 2019-02-14 11:37:05 · 448 阅读 · 0 评论 -
【一次过】Lintcode 482. 二叉树的某层节点之和
计算二叉树的某层节点之和。样例例1:输入:1 / \ 2 3 / \ / \4 5 6 7/ \ 8 9 和depth= 2输出:5例2:输入:1 / \ 2 3 / \ / \4 5 6 7/ \ 8 9 ...原创 2019-02-12 09:54:22 · 384 阅读 · 0 评论 -
【一次过】Lintcode 481. 二叉树叶子节点之和
计算二叉树的叶子节点之和样例例1:输入: 1 / \ 2 3 /4输出:7。例2:输入: 1 \ 3输出:3。解题思路1:遍历。/** * Definition of TreeNode: * public class TreeNode { * public int val;...原创 2019-02-12 09:28:06 · 452 阅读 · 0 评论 -
【两次过】Lintcode 470. 扭转后等价的二叉树
检查两棵二叉树是否在经过若干次扭转后可以等价。扭转的定义是,交换任意节点的左右子树。等价的定义是,两棵二叉树必须为相同的结构,并且对应位置上的节点的值要相等。样例例1:输入:{1,2,3,4},{1,3,2,#,#,#,4}输出:true说明: 1 1 / \ / \ 2 3 和 ...原创 2019-02-12 09:17:26 · 277 阅读 · 1 评论 -
【一次过】Lintcode 468. 对称二叉树
给你一颗二叉树,判断是否是对称二叉树样例例1:输入:{1,2,2,3,4,4,3}输出:true说明: 1 / \ 2 2 / \ / \ 3 4 4 3是一个对称的二叉树。例2:输入:{1,2,2,#,3,#,3}输出:false说明:1 / \...原创 2019-02-10 10:17:11 · 183 阅读 · 0 评论 -
【两次过】树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路:先判断以root1根节点当前节点是否与以root2为根节点为子树,若不是则继续判断root1的左子树与root2和root1的右子树与root2。/**public class TreeNode { int val = 0; TreeNode left =...原创 2019-04-14 15:13:47 · 67 阅读 · 0 评论 -
【两次过】Lintcode 475. 二叉树的最大路径和 II
给一棵二叉树,找出从根节点出发的路径中,和最大的一条。这条路径可以在任何二叉树中的节点结束,但是必须包含至少一个点(也就是根了)。样例Example 1:Input: {1,2,3}Output: 4Explanation: 1 / \ 2 3Example 2:Input: {1,-1,-1}Output: 1Explanation:...原创 2019-04-27 09:44:29 · 247 阅读 · 0 评论 -
【一次过】Lintcode 375. 克隆二叉树
深度复制一个二叉树。给定一个二叉树,返回一个他的克隆品。样例给定一个二叉树: 1 / \ 2 3 / \4 5返回其相同结构相同数值的克隆二叉树: 1 / \ 2 3 / \4 5解题思路:直接肝/** * Definition of TreeNode: * public cla...原创 2018-09-15 10:35:11 · 132 阅读 · 0 评论 -
【两次过】Lintcode 245. 子树
有两个不同大小的二叉树:T1有上百万的节点;T2有好几百的节点。请设计一种算法,判定T2是否为T1的子树。样例下面的例子中 T2 是 T1 的子树: 1 3 / \ / T1 = 2 3 T2 = 4 / 4下面的例子中 T2 不是 T1...原创 2018-09-10 09:31:31 · 133 阅读 · 0 评论 -
【一次过】Lintcode 1360. 对称树
给定二叉树,返回它是否是自身的镜像(即这棵二叉树是否对称)。样例样例1输入: {1,2,2,3,4,4,3}输出: true解释: 1 / \ 2 2 / \ / \3 4 4 3{1,2,2,3,4,4,3}这棵二叉树是对称的样例2输入: {1,2,2,#,3,#,3}输出: false解释: 1 / \ 2 ...原创 2018-07-14 10:17:44 · 171 阅读 · 0 评论 -
【一次过】Lintcode 175. 翻转二叉树
翻转一棵二叉树样例 1 1 / \ / \2 3 => 3 2 / \ 4 4挑战递归固然可行,能否写个非递归的?解题思路1: 递归。先将左孩子为根的子树翻转,再将右孩子为根的子树翻转,最后将该节点的左右子树翻转即可。/** * Definition of TreeNod...原创 2018-07-13 20:18:31 · 171 阅读 · 0 评论 -
【两次过】Lintcode 1172:二叉树倾斜程度
给定一个二叉树,返回整棵树的倾斜程度。一个节点的倾斜程度定义:左子树的所有节点和,与右子树所有节点和的绝对值差。空节点的倾斜程度定义为0。整棵树的倾斜程度定义:所有节点的倾斜程度之和。样例样例 1:输入: {1,2,3}输出: 1解释: 1 / \ 2 3节点2的倾斜程度 : 0节点3的倾斜程度 : ...原创 2018-05-20 21:01:13 · 313 阅读 · 0 评论 -
【三次过】691. 恢复二叉搜索树
在一棵二叉搜索树中, 只有两个节点是被交换的. 找到这些节点并交换, 如果没有节点被交换就返回原来的树的根节点.样例样例1输入: {4,5,2,1,3}输出: {4,2,5,1,3}解释:给出的二叉搜索树: 4 / \ 5 2 / \1 3返回: 4 / \ 2 5 / \1 3样例2输入: {1,2,5...原创 2019-05-12 11:20:29 · 132 阅读 · 0 评论 -
【两次过】Lintcode 701. 修剪二叉搜索树
给定一个有根的二分搜索树和两个数字min和max,修整这个树使得所有的数字在这个新的树种都是在min和max之间(包括min和max)。然后这个所得的树仍然是合法的二分搜索树。举个例子,输入是:然后我们给定min为5和max为13,这样得到的二分搜索树的结果应该是:样例样例1输入:{8,3,10,1,6,#,14,#,#,4,7,13}513输出: {8, 6, 10, #...原创 2019-05-12 10:26:22 · 154 阅读 · 0 评论 -
【两次过】Lintcode 902. BST中第K小的元素
给一棵二叉搜索树,写一个KthSmallest函数来找到其中第 K 小的元素。样例样例 1:输入:{1,#,2},2输出:2解释: 1 \ 2第二小的元素是2。样例 2:输入:{2,1,3},1输出:1解释: 2 / \1 3第一小的元素是1。挑战如果这棵 BST 经常会被修改(插入/删除操作)并且你需要很快速的找到第 K...原创 2018-10-10 10:14:10 · 171 阅读 · 0 评论 -
【两次过】Lintcode 7. 二叉树的序列化和反序列化
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。样例给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构: 3 / \9 20 / ...原创 2018-08-28 11:29:16 · 165 阅读 · 0 评论 -
【两次过】二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解题思路:分析二叉树的下一个节点,一共有以下情况:1.二叉树为空,则返回空;2.若节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;3.若节点右孩子不存在:查看该节点是否是其父节...原创 2019-05-11 09:39:56 · 107 阅读 · 0 评论 -
【两次过】二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)解题思路:dfsimport java.util.ArrayList;/**public class TreeNode { int val = 0; T...原创 2019-05-01 10:12:47 · 78 阅读 · 0 评论 -
【两次过】二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路:BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归...原创 2019-04-25 10:44:42 · 85 阅读 · 0 评论 -
【两次过】Lintcode 378. 将二叉查找树转换成双链表
将一个二叉查找树按照中序遍历转换成双向链表。样例样例 1:输入: 4 / \ 2 5 / \ 1 3 输出: 1<->2<->3<->4<->5样例 2:输入: 3 / \ 4 1输出:4<->3<->1解题思路1:分...原创 2019-04-23 11:20:22 · 257 阅读 · 0 评论 -
【两次过】Lintcode 467. 完全二叉树
判断一个二叉树是否是完全二叉树样例例1:输入:{1,2,3,4}输出:true说明: 1 / \ 2 3 / 4是完全二叉树。例2:输入:{1,2,3,#,4}输出:false说明: 1 / \ 2 3 \ 4...原创 2019-02-10 10:03:13 · 164 阅读 · 0 评论 -
【三次过】Lintcode 246. 二叉树的路径和 II
给一棵二叉树和一个目标值,设计一个算法找到二叉树上的和为该目标值的所有路径。路径可以从任何节点出发和结束,但是需要是一条一直往下走的路线。也就是说,路径上的节点的层级是逐个递增的。样例对于二叉树: 1 / \ 2 3 / /4 2给定目标值6。那么满足条件的路径有两条:[ [2, 4], [1, 3, 2]]解题思路:/...原创 2019-01-29 09:10:33 · 346 阅读 · 0 评论 -
【两次过】Lintcode 474. 最近公共祖先 II
给一棵二叉树和二叉树中的两个节点,找到这两个节点的最近公共祖先LCA。两个节点的最近公共祖先,是指两个节点的所有父亲节点中(包括这两个节点),离这两个节点最近的公共的节点。每个节点除了左右儿子指针以外,还包含一个父亲指针parent,指向自己的父亲。样例对于下面的这棵二叉树 4 / \3 7 / \ 5 6LCA(3, 5) = 4LCA(5,...原创 2018-12-22 11:11:29 · 499 阅读 · 0 评论 -
【两次过】Lintcode 453. 将二叉树拆成链表
将一棵二叉树按照前序遍历拆解成为一个假链表。所谓的假链表是说,用二叉树的right指针,来表示链表中的next指针。样例 1 \ 1 2 / \ \ 2 5 => 3 / \ \ \ 3 4 6 ...原创 2018-12-22 10:22:12 · 211 阅读 · 0 评论 -
【两次过】Lintcode 480. 二叉树的所有路径
480.二叉树的所有路径给一棵二叉树,找出从根节点到叶子节点的所有路径。样例给出下面这棵二叉树: 1 / \2 3 \ 5所有根到叶子的路径为:[ "1->2->5", "1->3"]解题思路1: 分治法。注意需要额外考虑叶子节点的问题,否则叶子节点将会被遗漏,导致输出为空。/** *...原创 2018-07-16 10:11:59 · 158 阅读 · 0 评论 -
【两次过】Lintcode 177. 把排序数组转换为高度最小的二叉搜索树
给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树。样例给出数组 [1,2,3,4,5,6,7], 返回 4 / \ 2 6 / \ / \1 3 5 7注意事项There may exist multiple valid solutions, return any of them.解题思路:二分搜索出中...原创 2018-11-27 13:16:56 · 119 阅读 · 0 评论 -
【一次过】Lintcode 71. 二叉树的锯齿形层次遍历
给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行)样例给出一棵二叉树{3,9,20,#,#,15,7}, 3 / \ 9 20 / \ 15 7返回其锯齿形的层次遍历为:[ [3], [20,9], [15,7]]解题思路:与Lintcode 69:Binary T...原创 2018-07-17 10:01:34 · 127 阅读 · 0 评论