
LC 树、分治与堆
文章平均质量分 50
Leetcode与Lintcode 树、分治与堆
记录算法题解
数学、算法爱好者,喜爱钻研各种数学和算法题。欢迎交流!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【Leetcode】2458. Height of Binary Tree After Subtree Removal Queries
给定一棵二叉树,题目保证每个节点的数值都不相同。再给定若干询问,每次询问给定给一个二叉树中的节点的数值,问如果将这个节点为根的子树删掉的话,整个二叉树的高度变成了多少。每次询问是独立的,并且不会真的删除子树。这可以用一遍DFS求出。接着再来一次DFS将每个节点的答案求出来。首先求一下每个节点的深度,树根的深度定义为。原创 2024-11-13 02:25:12 · 1002 阅读 · 0 评论 -
【Leetcode】2246. Longest Path With Different Adjacent Characters
显然我们需要分治的时候DFS返回从儿子向下能走的最长路径,关于点。问相邻点对应字母不同的路径中最长的那个路径的长度。,先递归求解其所有儿子子树的解,然后考虑经过点。的那些儿子中的两个的最长路径即可。是树根,每个点的父亲由。个点的树,点的标号是。原创 2024-08-10 13:09:01 · 321 阅读 · 0 评论 -
【Leetcode】107. Binary Tree Level Order Traversal II
对一棵二叉树进行层序遍历,并从下到上返回每一层的值。原创 2024-01-08 16:32:31 · 394 阅读 · 0 评论 -
【Leetcode】427. Construct Quad Tree
构造过程是递归的,每个节点有四个孩子,分别代表该节点所表示的方阵的左上、右上、左下和右下区块。如果该区块的值都相同,则该节点的值为这个相同值,四个孩子设为null;如果该节点所表示的方阵只有一个元素,则其为叶子。原创 2023-08-27 07:46:54 · 148 阅读 · 0 评论 -
【Leetcode】1801. Number of Orders in the Backlog
每个单下了以后,如果其是买单,则其会按照价格优先的方式满足价格低于或等于买单价格,然后撮合交易。问最后还有多少股数没有被交易完。可以开两个堆,分别存买单和卖单,按价格优先排序,买单的堆顶是最大买价,卖单的堆顶是最小卖价,这样一旦来了一个单子,就可以看堆顶是否能撮合交易。给定若干的下单,每个下单包含价格、股数和下单是买还是卖,原创 2023-01-24 07:35:20 · 271 阅读 · 0 评论 -
【Leetcode】871. Minimum Number of Refueling Stops
它一路向右走,给定若干位置,每个位置有加油站可以加一定数量的油,耗油和距离是。,则挑选经过过的加油站里油最多的那个加油继续走,如此循环。我们可以先忽略所有的加油站一直向右走,如果发现走不到。但是用光了备选的加油站,则说明到不了。的时候油恰好耗光也是可以的。有一个小车,初始位置在。原创 2023-01-08 08:11:21 · 220 阅读 · 0 评论 -
【Leetcode】971. Flip Binary Tree To Match Preorder Traversal
作为参数带着一起做前序遍历,当有可能需要翻转的时候就翻转,如果发现了矛盾则返回false告诉调用者。,题目保证树节点的值各不相同。问能否通过交换若干节点的左右孩子,使得二叉树的前序遍历恰好就是。如果能,则返回一个被翻转的节点列表,如果不能,则返回一个只含。题目保证树节点的值都非负。个节点的二叉树,和长。原创 2023-01-02 08:02:18 · 159 阅读 · 0 评论 -
【Leetcode】431. Encode N-ary Tree to Binary Tree
对于多叉树到二叉树的映射,具体说来就是,先将树根的所有孩子映射为二叉树,然后将第二到最后的所有孩子的映射值挂在第一个孩子的右孩子处作为右链存在,然后将第一个孩子的映射值挂在树根作为左孩子。这样的映射可以保证树根没有右孩子。对于反方向的映射,只需倒过来做,将左孩子的右链分别递归做映射,然后放到树根的孩子数组里即可。要求在多叉树和二叉树之间建立一个双射。原创 2022-12-12 14:41:45 · 327 阅读 · 0 评论 -
【Leetcode】2096. Step-By-Step Directions From a Binary Tree Node to Another
的具体路径,那么这两个路径第一次不同的那一步,说明是走到了两个节点的最近公共祖先,所以具体路径应该是,先从。给定一棵二叉树,题目保证二叉树各个节点的值不同。再给定二叉树里两个不同节点的值,一个是。的最短路径的每一步怎么走,以字符串形式返回。向上走若干步到最近公共祖先,余下的走法和。的具体路径走法相同。原创 2022-12-02 14:17:19 · 245 阅读 · 0 评论 -
【Leetcode】1506. Find Root of N-Ary Tree
个节点的多叉树的所有节点,求其树根节点。题目保证每个节点值不同。将所有孩子的值加入一个哈希表,那么不在哈希表里的节点就是树根。原创 2022-11-11 14:05:38 · 198 阅读 · 0 评论 -
【Leetcode】428. Serialize and Deserialize N-ary Tree
上面要注意几个细节,为了节省空间,我们在节点有孩子或者该节点是其父亲的最后一个孩子的情况下,将其后面的逗号去掉了。在序列化的时候,我们规定,对于每个节点,如果这个节点有孩子,那么其孩子都在这个节点紧跟的括号里,并且这些孩子的“括号深度”都相等。这样在反序列化的时候,括号深度每进一步,也就说明了走到了下一层。这里需要注意,当栈顶就是树根的时候,pop掉树根之后就找不到了(事实上最后一个pop的元素也必然是树根),所以我们干脆将栈pop的元素直接记为树根变量,那么全pop完之后,那个树根变量就是真正的树根。原创 2022-11-10 16:34:10 · 478 阅读 · 0 评论 -
【Leetcode】272. Closest Binary Search Tree Value II
带着两个双端队列对BST进行中序遍历,将小于等于。最后用类似双指针的办法,从离。个节点的二叉搜索树,再给定一个值。最近的数开始两边扩展至。个数存下来(如果不够。原创 2022-11-10 13:30:08 · 216 阅读 · 0 评论 -
【Leetcode】1530. Number of Good Leaf Nodes Pairs
可以用分治法,先递归左右子树,求得所有叶子离当前节点的距离(假设这些距离已经排好序),然后用双指针求得经过当前节点的距离小于等于。的叶子点对的数量,最后将整个子树的所有叶子离当前节点父亲的距离信息返回给父亲。给定一棵二叉树,求其路径长度小于等于给定值。的叶子节点对的个数。顺序不同也算一个点对。,具体时间取决于树的形态,空间。如果树平衡的话,时间复杂度。原创 2022-11-09 11:27:05 · 221 阅读 · 0 评论 -
【Leetcode】510. Inorder Successor in BST II
不空也没有右孩子,但有父亲,则顺着其父亲向上走,第一次右拐的时候,就找到了。给定一棵二叉树,每个节点存了其左右孩子和父亲节点的指针,问给定节点。不空但有右孩子,则其右孩子所在的左链的最左端点即为。不空,没有右孩子也没有父亲,则其无后继。为空,则其没有后继;原创 2022-10-31 10:38:24 · 182 阅读 · 0 评论 -
【Leetcode】932. Beautiful Array
表示连接),由于左右两边满足条件,而左半边为奇数右半边为偶数,显然。是奇数,则让左半边多取一个数即可。,所以整个数组也满足条件。也是满足条件的数组。是偶数,我们构造出由。构成的满足条件的数组。跨界取则不存在符合的。原创 2022-10-15 08:32:22 · 220 阅读 · 0 评论 -
【Leetcode】2246. Longest Path With Different Adjacent Characters
https://leetcode.com/problems/longest-path-with-different-adjacent-characters/给定一棵nnn个节点的有根树,每个节点的编号0∼n−10\sim n-10∼n−1,并且每个节点iii对应一个字符s[i]s[i]s[i]。问树中最长的相邻节点字符不同的路径长度。枚举路径最高节点,递归求所有当前节点儿子出发向下的最长路径长度,求出不同于当前节点字符的儿子的最长路径前两名,那么也就求出了最高节点为当前节点的最长路径长度。枚举完所有最高点之原创 2022-07-06 11:25:39 · 349 阅读 · 0 评论 -
【Lintcode】854. Closest Leaf in a Binary Tree
题目地址:https://www.lintcode.com/problem/854/description给定一棵二叉树,每个节点值不同。再给定一个其中节点的数值kkk,求离kkk最近的叶子节点(如果kkk本身就是叶子,则返回其本身)。如果有多个解,则优先返回其左子树中的;如果左子树为空,则优先返回其右子树中的。先BFS一遍,找到节点kkk,并且存一下每个节点的父亲。接着再BFS一遍,求离kkk最近的叶子。入队的时候要按照左右父这种顺序。代码如下:import java.util.*;publi原创 2022-05-09 05:33:44 · 153 阅读 · 0 评论 -
【Leetcode】14. Longest Common Prefix
题目地址:https://leetcode.com/problems/longest-common-prefix/给定一个字符串数组,求其最长公共子前缀。法1:分治法。public class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs....原创 2020-01-26 11:43:06 · 180 阅读 · 1 评论 -
【Leetcode】1382. Balance a Binary Search Tree
一个比较简单的方法是,先中序遍历,然后直接建一下BBST,建树过程可以递归地做,取中点做树根,然后递归建立左右子树。给定一个二叉搜索树,要求返回其平衡的版本。原创 2021-09-08 04:38:40 · 340 阅读 · 0 评论 -
【Leetcode】99. Recover Binary Search Tree
题目地址:https://leetcode.com/problems/recover-binary-search-tree/给定一棵二叉树,交换其恰好两个节点就可以使之成为一棵BST。要求交换那两个节点然后返回新树树根,不允许改变树的结构。要求空间O(1)O(1)O(1)。可以采用Morris中序遍历。交换两个节点之后,中序遍历的序列中可能会有一次下降(交换相邻位置数的情况),也可能会有两次下降(交换不相邻位置数的情况),设要交换的两个节点分别为ppp和qqq,那么先找到第一次下降的数对中第一个数,暂原创 2021-09-07 00:32:01 · 187 阅读 · 0 评论 -
【Lintcode】1512. Minimum Cost to Hire K Workers
题目地址:https://www.lintcode.com/problem/1512/给定nnn个工人,其有两个属性,一个是质量,一个是期望工资,以长nnn数组qqq和www表示。给定一个正整数k,k≤nk,k\le nk,k≤n,要求雇佣恰好kkk名工人,使得这kkk个工人,每个工人的薪资与其qqq值成比例,并且每个工人的薪资不低于其期望薪资。问满足条件的情况下,最少总共要付多少薪资。参考https://blog.csdn.net/qq_46105170/article/details/119380原创 2021-09-04 00:06:30 · 200 阅读 · 0 评论 -
【Leetcode】968. Binary Tree Cameras
题目地址:https://leetcode.com/problems/binary-tree-cameras/给定一棵二叉树,允许在每个节点上放置“守卫”,其可以守卫当前节点以及与其相邻的节点(父亲节点和两个孩子都会被守卫到)。问最少放多少个守卫就可以使得所有节点都被守卫到。思路是动态规划。设f[x]f[x]f[x]表示当xxx子树都被守卫到的情况下的最小守卫数量,f[x]f[x]f[x]是个长333的数组,f[x][0]f[x][0]f[x][0]表示xxx处没有守卫并且其被其父亲的守卫所守卫的情况原创 2021-08-09 00:34:03 · 193 阅读 · 0 评论 -
【Leetcode】156. Binary Tree Upside Down
题目地址:https://leetcode.com/problems/binary-tree-upside-down/给定一棵二叉树,要求对其从树根出发的左链做如下图的操作。返回新二叉树。思路是DFS。在DFS的时候要把节点父亲作为参数传下去。先递归处理左子树,如果遇到没有左孩子的节点,那么它就是新树根,把它存一下。然后处理当前节点,其左孩子是其父亲的右孩子,然后其右孩子就是父亲。最后原树根就是叶子了,还需要把它的左右孩子置为null。最后返回新树根即可。代码如下:public class Sol原创 2021-08-08 02:32:16 · 353 阅读 · 0 评论 -
【Leetcode】857. Minimum Cost to Hire K Workers
题目地址:https://leetcode.com/problems/minimum-cost-to-hire-k-workers/给定nnn个工人,其有两个属性,一个是质量,一个是期望工资,以长nnn数组qqq和www表示。给定一个正整数k,k≤nk,k\le nk,k≤n,要求雇佣恰好kkk名工人,使得这kkk个工人,每个工人的薪资与其qqq值成比例,并且每个工人的薪资不低于其期望薪资。问满足条件的情况下,最少总共要付多少薪资。import java.util.ArrayList;import原创 2021-08-04 11:59:45 · 285 阅读 · 0 评论 -
【Leetcode】1660. Correct a Binary Tree
题目地址:https://leetcode.com/problems/correct-a-binary-tree/给定一棵二叉树,其中有且只有一个节点的左或者右指针指向了与其同层的节点,要求将该“错误”节点及其子树从原树中删除,返回原树树根。思路是BFS,同时用哈希表存一下每个节点的父亲。如果遍历某个节点的时候,发现其某个孩子的父亲已经存在了,则说明当前节点指针错误,则找到当前节点的父亲,然后将当前节点删掉。代码如下:import java.util.HashMap;import java.uti原创 2021-08-03 00:11:11 · 220 阅读 · 0 评论 -
【Leetcode】1373. Maximum Sum BST in Binary Tree
题目地址:https://leetcode.com/problems/maximum-sum-bst-in-binary-tree/给定一棵二叉树,求其数值总和最大的二叉搜索树的数值总和。空树也算一棵BST。思路是分治。要求每次DFS的时候返回当前子树是否是一棵BST,数值总和,最小值和最大值。设f[x]={b,s,m,M}f[x]=\{b, s, m, M\}f[x]={b,s,m,M},其中b,s,m,Mb,s,m,Mb,s,m,M分别是xxx子树是否是BST,数值总和,最小值和最大值,设x.lx原创 2021-08-03 00:00:04 · 246 阅读 · 0 评论 -
【Leetcode】1740. Find Distance in a Binary Tree
题目地址:https://leetcode.com/problems/find-distance-in-a-binary-tree/给定一棵二叉树,题目保证节点数值各不相同,再给定两个节点的值ppp和qqq,题目保证ppp和qqq在树中,问它们之间的距离。树的边权都视为111。思路是分治。开一个DFS函数,其输入是树节点,并带上节点的深度作为参数,返回的是该子树中是否存在ppp与qqq其一,并且开三个全局变量,一个是最终答案,另外两个分别是ppp和qqq各自的深度。在DFS到当前节点的时候,如果当前节原创 2021-08-03 00:01:15 · 906 阅读 · 0 评论 -
【Leetcode】998. Maximum Binary Tree II
题目地址:https://leetcode.com/problems/maximum-binary-tree-ii/考虑Treap的建树方式,给定一个数组AAA,该Treap的堆性质由A[i]A[i]A[i]来维护,其BST性质由下标维护。那么Treap的建树方式的递归的,树根是全数组最大值A[k]A[k]A[k],然后其左子树和右子树分别是A[0:k−1]A[0:k-1]A[0:k−1]和A[k+1:]A[k+1:]A[k+1:],接着就可以递归建树了。给定一棵已经建好的Treap的树根,其是以某个数原创 2021-08-02 06:51:38 · 189 阅读 · 0 评论 -
【Leetcode】655. Print Binary Tree
题目地址:https://leetcode.com/problems/print-binary-tree/给定一棵二叉树,要求将其打印出来,返回字符串列表的列表,该列表里一共有树的高度个列表,每个列表的长度是2h−12^h-12h−1,并且:1、树根应该在res[0][(n-1)/2];2、对于在res[r][c]的节点,其左孩子应该在res[r+1][c-2^(height-r-1)],其右孩子应该在res[r+1][c+2^(height-r-1)];3、以空串表示null节点;先求树高,然原创 2021-08-02 06:31:13 · 184 阅读 · 0 评论 -
【Leetcode】1586. Binary Search Tree Iterator II
普通的BST中序遍历迭代器可以用栈来实现,栈始终存的是一条左链,并且栈顶是将要遍历的下一个数字。这里还需要实现prev操作,可以再加上一个列表和一个指针,该列表存已经遍历过的数,按中序遍历的顺序存储,而指针指向当前遍历到的位置。在实现next的时候,如果指针不是指向列表里的最后一个数,那可以直接指针后移一位,取出列表中的那个元素;如果该迭代器可以后移,则返回true,否则返回false;如果该迭代器可以前移,则返回true,否则返回false;后移迭代器,并返回其指向的数值;每个操作均摊时间复杂度。原创 2021-08-02 03:44:27 · 382 阅读 · 0 评论 -
【Leetcode】1214. Two Sum BSTs
题目地址:https://leetcode.com/problems/two-sum-bsts/给定两棵二叉搜索树,再给定一个数xxx,问两棵BST里是否各自存在一个节点使得它们之和恰好等于xxx。在两个序列上做这件事是容易的,可以直接用对撞双指针(一个指针指向第一个数组的开头,另一个指向第二个数组的结尾)。现在要在两棵BST上做,思路是一样的,可以先实现二叉树的中序遍历的迭代器,以及逆序中序遍历的迭代器,然后就可以当成数组的情况来做了。中序遍历迭代器的写法是用栈,初始化的时候,先将树根所在的左链p原创 2021-08-02 03:08:15 · 333 阅读 · 0 评论 -
【Leetcode】776. Split BST
题目地址:https://leetcode.com/problems/split-bst/给定一棵二叉搜索树,再给定一个数值xxx,要求将该BST分裂成两棵BST,第一个小于等于xxx,另一个大于xxx。在结果中,要求尽量保持原有的结构,除了必须分裂的地方,其余节点的父子关系应该保持原样。思路是分治。设f[rt]={l,r}f[rt]=\{l,r\}f[rt]={l,r},rtrtrt是当前树根,lll是分裂出来的小于xxx的BST树根,rrr是分裂出来的大于xxx的BST树根。如果x≥rtx\ge原创 2021-08-02 02:02:17 · 429 阅读 · 0 评论 -
【Lintcode】1108. Find Duplicate Subtrees
题目地址:https://www.lintcode.com/problem/1108/description给定一棵二叉树,求其所有结构与值完全相同的子树,每种类型返回其中一个树根即可。思路是序列化,DFS到某个节点的时候,序列化该子树,然后用哈希表计数。序列化的过程可以用分治来完成。代码如下:import java.util.*;public class Solution { /** * @paramn n: An integer * @return: A list原创 2021-08-01 01:05:05 · 152 阅读 · 0 评论 -
【Lintcode】1129. Smallest Subtree with All the Deepest Nodes
题目地址:https://www.lintcode.com/problem/1129/给定一棵二叉树,求其一棵子树,该子树包含了所有该二叉树的最深的节点。返回其根。思路是DFS。先递归求解左右子树,返回左右子树的包含该子树的最深节点的树根,以及左右子树各自的深度,如果两个都是null,则说明当前是叶子,则返回当前节点及其深度;如果一个是null,则返回另一个;如果都不是null,则看深度,如果两者不一样深,则返回更深的那个;如果一样深,则说明当前树根是含所有最深节点的子树根,则返回当前树根及当前子树最原创 2021-07-31 16:33:13 · 123 阅读 · 0 评论 -
【Leetcode】652. Find Duplicate Subtrees
题目地址:https://leetcode.com/problems/find-duplicate-subtrees/给定一棵二叉树,求其所有的出现多次的子树,返回这些子树的根(每种类型的子树返回任意的其中一个根即可)。思路是DFS + 序列化。在DFS到某个节点的时候,就将该节点为根的子树进行序列化(进行先序遍历序列化。当然其他序的序列化也是可以的),然后存入HashMap中。如果某个序列化的字符串出现了多次,则说明存在多个形状相同的树。代码如下:import java.util.ArrayLis原创 2021-07-30 07:06:18 · 221 阅读 · 0 评论 -
【Leetcode】889. Construct Binary Tree from Preorder and Postorder Traversal
题目地址:https://leetcode.com/problems/construct-binary-tree-from-preorder-and-postorder-traversal/给定一棵二叉树的前序和后序遍历,构造之。题目保证节点个数是nnn且节点编号是1∼n1\sim n1∼n且彼此不同,且输入确实是某棵二叉树的遍历。答案不唯一的话返回任意一个。事实上有这样一个结论,对于一棵二叉树,如果每个内部节点的孩子个数都是222,那么其前序遍历和后序遍历就能唯一确定该树的结构(当然每个节点要值互不原创 2021-07-28 14:42:36 · 291 阅读 · 0 评论 -
【Lintcode】1066. Verify Preorder Serialization of a Binary Tree
题目地址:https://www.lintcode.com/problem/1066/description给定一棵二叉树的前序遍历,问其是否合法。该前序遍历是含null节点的,null以'#'表示。其余节点以数字表示,以','隔开。递归做法参考https://blog.csdn.net/qq_46105170/article/details/119077433。下面介绍一个用栈的做法。可以用栈模拟前序遍历,主要问题是遍历到null的时候怎么判断它是左儿子还是右儿子。这里采用这种办法,每次遍历到nul原创 2021-07-26 00:29:04 · 118 阅读 · 0 评论 -
【Leetcode】331. Verify Preorder Serialization of a Binary Tree
做split,这样就得到了每个节点元素。接着开始模拟建树,并用一个下标来跟踪用到了哪个节点。如果该建立节点但是无元素可用了,则返回false;如果是null,则建出null节点,后移指针并返回true,否则说明是一个非null节点,建立之指针后移,然后递归建立左子树和右子树,如果其一建立失败就返回false,否则返回true。给定一棵二叉树的前序遍历,问其是否合法。该前序遍历是含null节点的,null以。直接模拟以二叉树前序遍历建树的过程就行了。其余节点以数字表示,以。原创 2021-07-25 09:27:57 · 164 阅读 · 1 评论 -
【Lintcode】901. Closest Binary Search Tree Value II
题目地址:https://www.lintcode.com/problem/901/description给定一棵二叉搜索树,再给定一个数值xxx和一个非负整数kkk,求树中与xxx最近的kkk个数的数值。题目保证kkk合法。当在一个数组里求这kkk个数的时候,import java.util.ArrayList;import java.util.Deque;import java.util.LinkedList;import java.util.List;public class Sol原创 2021-07-08 20:01:16 · 148 阅读 · 0 评论 -
【Leetcode】1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
题目地址:https://leetcode.com/problems/find-a-corresponding-node-of-a-binary-tree-in-a-clone-of-that-tree/给定两棵一模一样的二叉树,再给定第一棵树中的某个节点xxx,求第二棵树中对应的节点。可以做DFS,同时对两棵树搜索,第一棵树中搜索到xxx的时候,搜到的第二棵树中的节点即为所求。代码如下:public class Solution { public final TreeNode getTar原创 2021-07-08 13:04:10 · 232 阅读 · 0 评论