树
文章平均质量分 52
Sun_Sky_Sea
站在巨人的肩膀上
展开
-
208. 实现 Trie (前缀树)
原始题目链接:https://leetcode.cn/problems/implement-trie-prefix-tree/Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word原创 2022-06-14 20:13:21 · 80 阅读 · 0 评论 -
211. 添加与搜索单词 - 数据结构设计
原始题目链接:https://leetcode.cn/problems/implement-trie-prefix-tree/Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word原创 2022-06-13 17:51:39 · 114 阅读 · 0 评论 -
1008. 前序遍历构造二叉搜索树
1008. 前序遍历构造二叉搜索树原始题目链接:https://leetcode.cn/problems/construct-binary-search-tree-from-preorder-traversal/给定一个整数数组,它表示BST(即 二叉搜索树 )的 先序遍历 ,构造树并返回其根。保证 对于给定的测试用例,总是有可能找到具有给定需求的二叉搜索树。二叉搜索树 是一棵二叉树,其中每个节点, Node.left 的任何后代的值 严格小于 Node.val , Node.right 的任何后代原创 2022-05-17 22:49:03 · 375 阅读 · 0 评论 -
173. 二叉搜索树迭代器
173. 二叉搜索树迭代器实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。int next()将指针向右移原创 2022-05-14 21:25:46 · 111 阅读 · 0 评论 -
331. 验证二叉树的前序序列化
331. 验证二叉树的前序序列化原始题目链接:https://leetcode.cn/problems/verify-preorder-serialization-of-a-binary-tree/序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。解题思路:使用栈模拟验证是否是满足题意,具体看参考文献的思路。代码实现:class Solution: def isValidSer原创 2022-05-14 21:01:10 · 150 阅读 · 0 评论 -
297. 二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化原始题目链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字原创 2022-05-14 18:11:26 · 76 阅读 · 0 评论 -
449. 序列化和反序列化二叉搜索树
449. 序列化和反序列化二叉搜索树原始题目链接:https://leetcode.cn/problems/serialize-and-deserialize-bst/序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。编码的字符原创 2022-05-11 22:54:24 · 138 阅读 · 0 评论 -
112. 路径总和
112. 路径总和原始题目链接:https://leetcode-cn.com/problems/path-sum/给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。解题思路:递归的找一条路径,满足即可返回True,否则就返回False,路径一定是到叶子节点的。代码实现:#原创 2022-04-30 13:35:15 · 445 阅读 · 0 评论 -
108. 将有序数组转换为二叉搜索树
108. 将有序数组转换为二叉搜索树原始题目链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。解题思路:构建树的过程就是递归的过程,给的数组有序要利用起来,题目要求构建二叉平衡搜索树,有两个要求,第原创 2022-04-30 13:22:39 · 424 阅读 · 0 评论 -
110. 平衡二叉树
110. 平衡二叉树原始题目链接:https://leetcode-cn.com/problems/balanced-binary-tree/给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。解题思路:用一个工具函数来计算子树的高度,这里面要用到递归,这里有个总结: 递归函数什么时候需要返回值?什么时候不需要返回值?如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(113题)原创 2022-04-30 12:53:07 · 411 阅读 · 0 评论 -
222. 完全二叉树的节点个数
222. 完全二叉树的节点个数原始题目链接:https://leetcode-cn.com/problems/count-complete-tree-nodes/给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例 2:输入:root = []输出:0示例 3:输入:root原创 2022-04-10 11:56:42 · 862 阅读 · 0 评论 -
337. 打家劫舍 III
打家劫舍 III原始题目链接:https://leetcode-cn.com/problems/house-robber-iii/小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。输.原创 2022-02-14 22:52:21 · 301 阅读 · 0 评论 -
1367. 二叉树中的列表
1367. 二叉树中的列表原始题目链接:https://leetcode-cn.com/problems/linked-list-in-binary-tree/给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 True ,否则返回 False 。一直向下的路径的意思是:从树中某个节点开始,一直连续向下的路径。解题思路:这道题使用枚举法去求解,枚举法原创 2021-05-07 22:00:37 · 227 阅读 · 0 评论 -
971. 翻转二叉树以匹配先序遍历
971. 翻转二叉树以匹配先序遍历原始题目链接:https://leetcode-cn.com/problems/flip-binary-tree-to-match-preorder-traversal/给你一棵二叉树的根节点 root ,树中有 n 个节点,每个节点都有一个不同于其他节点且处于 1 到 n 之间的值。另给你一个由 n 个值组成的行程序列 voyage ,表示 预期 的二叉树 先序遍历 结果。通过交换节点的左右子树,可以 翻转 该二叉树中的任意节点。例,翻转节点 1 的效果如下:原创 2021-04-08 17:34:17 · 90 阅读 · 0 评论 -
226. 翻转二叉树
226. 翻转二叉树原始题目链接:https://leetcode-cn.com/problems/invert-binary-tree/解题思路:实现方式有2种,一种是递归,一种是迭代。核心都是直接交换左右子树,只不过递归不需要用到额外的存储是深度优先遍历的方式,迭代需要用到队列来存储节点是广度优先遍历的方式。具体实现看代码及注释。代码实现:递归解法# Definition for a binary tree node.# class TreeNode:# def __ini原创 2021-04-08 15:59:51 · 52 阅读 · 0 评论 -
面试题 04.06. 后继者
面试题 04.06. 后继者原始题目链接:https://leetcode-cn.com/problems/successor-lcci/设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。如果指定节点没有对应的“下一个”节点,则返回null。解题思路:利用二叉搜索树的性质,中序遍历的二叉搜索树是有序的序列,所以可以使用二分法进行解题。具体实现看代码及注释。代码实现:# Definition for a binary tree node.# class TreeNod原创 2021-04-07 20:56:53 · 63 阅读 · 1 评论 -
543. 二叉树的直径
543. 二叉树的直径原始题目链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。解题思路:题目出现任意两个节点,会联想到在遍历的过程中需要比较并更新最大值,或者使用双递归的方式解题。遍历二叉树的方式根据题意,使用后序遍历方式自底向上来计算比较方便。计算树中节点的高度,可以用递归的方式来解题,当前节点原创 2021-04-07 17:32:26 · 60 阅读 · 0 评论 -
101. 对称二叉树
101. 对称二叉树原始题目链接:https://leetcode-cn.com/problems/symmetric-tree/给定一个二叉树,检查它是否是镜像对称的。**解题思路:**递归实现:递归的比较左子树.left 和右子树.right、左子树.right和右子树.left是否相等,这样比较是根据题意要求的镜面对称。递归函数的结束条件:有两种情况1、左右子树的节点值不相等(有两种情况,左右子树都存在并且节点值不相等,左右子树有一个为空),不符合题意,返回False;2、左右子树都为空原创 2021-04-01 21:27:10 · 53 阅读 · 0 评论 -
104. 二叉树的最大深度
104. 二叉树的最大深度原始题目链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。解题思路:这道题比较直接的想法是层序遍历二叉树,根据题意,二叉树的深度为根节点到最远叶子节点的最长路径上的节点数,就是记录层数,最后返回层数即可。具体实现看代码及注释。代码实现:# Definitio原创 2021-04-01 20:35:38 · 60 阅读 · 0 评论 -
1026. 节点与其祖先之间的最大差值
1026. 节点与其祖先之间的最大差值原始题目链接:https://leetcode-cn.com/problems/maximum-difference-between-node-and-ancestor/给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)解题思路:根据题意,在遍历原创 2021-04-01 15:07:17 · 56 阅读 · 0 评论 -
1325. 删除给定值的叶子节点
1325. 删除给定值的叶子节点原始题目链接:https://leetcode-cn.com/problems/delete-leaves-with-a-given-value/给你一棵以 root 为根的二叉树和一个整数 target ,请你删除所有值为 target 的 叶子节点 。注意,一旦删除值为 target 的叶子节点,它的父节点就可能变成叶子节点;如果新叶子节点的值恰好也是 target ,那么这个节点也应该被删除。也就是说,你需要重复此过程直到不能继续删除。解题思路:使用原创 2021-03-31 16:49:57 · 217 阅读 · 0 评论 -
783. 二叉搜索树节点最小距离
783. 二叉搜索树节点最小距离原始题目链接:https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes/给定一个二叉搜索树的根节点 root,返回树中任意两节点的差的最小值。解题思路:二叉搜索树,中序遍历是有序的序列。题目是要计算任意两点的最小距离,有序的序列相邻的节点的差值是最小的,所以在中序遍历二叉搜索树的同时,用一个变量每次统计记录最小值,最后保留下来的值就是答案。具体实现看代码及注释(按照个人习惯,可以将递归函原创 2021-03-30 18:11:05 · 69 阅读 · 0 评论 -
563. 二叉树的坡度
563. 二叉树的坡度原始题目链接:https://leetcode-cn.com/problems/binary-tree-tilt/给定一个二叉树,计算 整个树的坡度 。一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。整个树 的坡度就是其所有节点的坡度之和。解题思路:根据题意,需要任意节点的坡度,最后累加坡度获得整棵树的坡度。典型的使用递归方法解题,具体原创 2021-03-30 14:07:40 · 91 阅读 · 1 评论 -
面试题 04.12. 求和路径
面试题 04.12. 求和路径原始题目链接:https://leetcode-cn.com/problems/paths-with-sum-lcci/给定一棵二叉树,其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径的数量。注意,路径不一定非得从二叉树的根节点或叶节点开始或结束,但是其方向必须向下(只能从父节点指向子节点方向)。解题思路:这道题使用双递归的方法,一般遇到题目中有说任意节点开始XXX或者所有XXX这样问题,可以考虑使用双递归解法。原创 2021-03-29 18:34:03 · 62 阅读 · 0 评论 -
124. 二叉树中的最大路径和
124. 二叉树中的最大路径和路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。解题思路:这道题需要在递归的同时,记录并比较最大路径,所以需要定义一个功能函数,这个函数的作用是计算当前遍历到的节点的增益,每次都和0比较,因为如果是负数的话,路径总和会变小,不符合题目要求。还需要定义一个原创 2021-03-26 19:02:45 · 280 阅读 · 0 评论 -
662. 二叉树最大宽度
662. 二叉树最大宽度给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。解题思路:利用满二叉树树的性质,当前节点的坐标和其对应的左右子树节点的坐标的关系,当前节点的坐标是i,则左孩子节点的坐标是2i,有孩子节点的坐标是2i+1。由于是利用满二叉树,所以使用层序遍历树的形式较为合适原创 2021-03-26 16:11:58 · 109 阅读 · 1 评论 -
99. 恢复二叉搜索树
恢复二叉搜索树原始题目链接:https://leetcode-cn.com/problems/recover-binary-search-tree/给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?解题思路:1、先中序遍历,得到包含被错误交换的节点列表。2、将中序遍历得到的列表进行排序。3、查找两个列表不一样的值,交换即可。代码实现:#.原创 2021-03-18 23:07:22 · 109 阅读 · 1 评论 -
98. 验证二叉搜索树
98. 验证二叉搜索树给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。解题思路:最简单的想法,根据中序遍历有序来判断。 实现方式可以分为两种:1、递归;2、迭代;具体实现看代码。代码实现:1、递归# Definition for a binary tree node.# class TreeNode:# def __i原创 2021-03-15 17:54:58 · 53 阅读 · 0 评论 -
863. 二叉树中所有距离为 K 的结点
863. 二叉树中所有距离为 K 的结点原始题目链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。提示:给定的树是非空的。树上的每个结点都具有唯一的值 0 <= node.val <= 500 。目标结点 t原创 2021-03-15 15:30:58 · 120 阅读 · 0 评论 -
450. 删除二叉搜索树中的节点
450. 删除二叉搜索树中的节点给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。解题思路:二叉搜索树的特点:中序遍历的序列是递增排序的序列。这边定义两个函数:successor和predecessor,分别用于查找二叉搜索树当前节点按照中序遍历的后继和前驱节点(前提要求当前节点必须有右、左子树原创 2021-03-04 17:11:41 · 78 阅读 · 1 评论 -
116. 填充每个节点的下一个右侧节点指针
116. 填充每个节点的下一个右侧节点指针原始题目链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一原创 2021-03-03 18:31:25 · 66 阅读 · 2 评论 -
654. 最大二叉树
654. 最大二叉树原始题目链接:https://leetcode-cn.com/problems/maximum-binary-tree/给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:二叉树的根是数组 nums 中的最大元素。左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。返回有给定数组 nums 构建的 最大二叉树 。解题思路:递归构建最大二叉树即可。 递归的三原创 2021-03-03 11:01:16 · 69 阅读 · 1 评论 -
297. 二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化原始题目链接:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且原创 2021-03-02 00:01:41 · 83 阅读 · 0 评论 -
1123. 最深叶节点的最近公共祖先
1123. 最深叶节点的最近公共祖先原始题目链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-deepest-leaves/给你一个有根节点的二叉树,找到它最深的叶节点的最近公共祖先。输入:root = [3,5,1,6,2,0,8,null,null,7,4] 输出:[2,7,4] 解释: 我们返回值为 2的节点,在图中用黄色标记。 在图中用蓝色标记的是树的最深的节点。注意,节点 6、0 和 8 也是叶节点,但是它们的原创 2021-02-22 18:05:33 · 153 阅读 · 0 评论 -
1372. 二叉树中的最长交错路径
1372. 二叉树中的最长交错路径原始题目链接:https://leetcode-cn.com/problems/longest-zigzag-path-in-a-binary-tree/给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下:选择二叉树中 任意 节点和一个方向(左或者右)。如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。改变前进方向:左变右或者右变左。重复第二步和第三步,直到你在树中无法继续移动。交错路径的长度定义为:访问过的节点数目 - 1原创 2021-02-21 16:44:59 · 261 阅读 · 2 评论 -
113. 路径总和 II
113. 路径总和 II原始题目链接:https://leetcode-cn.com/problems/path-sum-ii/给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22,返回:解题思路:这道题是二叉树搜索问题,使用回溯法可以解决该类问题。回溯:树的遍历+路径记录。树的遍历:一般使用先序遍历,即根、左、右的顺序遍历树中的所有节点。路径记录:在先序遍历的过原创 2021-02-20 19:57:04 · 45 阅读 · 0 评论 -
树的迭代遍历
树的迭代遍历深度优先遍历(Depth-First-Search,DFS),沿着树的深度遍历树的节点,尽可能深的搜索树的分支。原创 2021-02-19 16:43:47 · 557 阅读 · 0 评论 -
1530. 好叶子节点对的数量
1530. 好叶子节点对的数量原始题目链接:https://leetcode-cn.com/problems/number-of-good-leaf-nodes-pairs/给你二叉树的根节点 root 和一个整数 distance 。如果二叉树中两个 叶 节点之间的 最短路径长度 小于或者等于 distance ,那它们就可以构成一组 好叶子节点对 。返回树中 好叶子节点对的数量 。输入:root = [1,2,3,null,4], distance = 3输出:1解释:树的叶节点是 3原创 2021-02-05 20:57:45 · 188 阅读 · 0 评论