Leetcode 树
文章平均质量分 60
Leetcode中跟树有关的题目
努利!奋斗!
这个作者很懒,什么都没留下…
展开
-
Leetcode 1268. Search Suggestions System
leetcode原创 2022-07-27 13:46:02 · 1491 阅读 · 0 评论 -
Leetcode 366. Find Leaves of Binary Tree
leetcode 树原创 2022-06-29 11:55:58 · 170 阅读 · 0 评论 -
leetcode 2096. Step-By-Step Directions From a Binary Tree Node to Another
leetcode原创 2022-06-28 13:32:52 · 1020 阅读 · 0 评论 -
Leetcode 2265. Count Nodes Equal to Average of Subtree
题目解法:递归返回值分别代表·{以当前节点作为根节点的子树所有数字和,符合条件的节点个数,以当前节点作为根节点的子树的节点总数}class Solution {public: vector<int> helper(TreeNode* node){ if(!node) return {0,0,0}; if(!node->left && !node->right) return {node->val,1,1};原创 2022-05-15 01:54:34 · 186 阅读 · 0 评论 -
Leetcode 2261. K Divisible Elements Subarrays
题目解析这道题目有几个关键点:如何形成所有的subarray如何保证subarray distinct如何keep track这个divisible elements number错误解法一开始在做这道题目的时候陷入了一个误区,觉得对于每一个subarray需要分别数出里面有多少个divisible的element,自然而然地想到了prefix sum of divisible cnt。而且对于如何形成subarray没有清晰的认知,觉得是需要遍历所有可能的长度从而得到所有subarra原创 2022-05-04 12:15:21 · 275 阅读 · 0 评论 -
Leetcode 677. Map Sum Pairs
题目解法:使用前缀树或者字典树每个节点代表一个字母,利用map来储存相邻字符之间的关系这个题还需要后续深入理解struct TrieNode{ TrieNode* child[26] = {}; int sum = 0;};class MapSum {public: TrieNode trieRoot; unordered_map<string,int> map_; void insert(string key, int v原创 2022-04-15 13:17:04 · 349 阅读 · 0 评论 -
Leetcode 449. Serialize and Deserialize BST
题目解法按照特定顺序(比如前序遍历)进行serialize,也按照同样的方式进行deserialize,就能保证还原的顺序。class Codec: def serialize(self, root: Optional[TreeNode]) -> str: """Encodes a tree to a single string. """ if not root: return 'X' left原创 2022-03-07 13:27:43 · 188 阅读 · 0 评论 -
Leetcode 103. Binary Tree Zigzag Level Order Traversal (cpp)
题目解法1:DFSclass Solution {public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int>> ans; dfs(ans,root,0); for(int i = 0;i<ans.size();i++){ if(i % 2 == 0) continu原创 2021-01-09 08:16:46 · 84 阅读 · 0 评论 -
Leetcode 1382. Balance a Binary Search Tree (python+cpp)
题目解法:inorder得到排序数组divide and conquer简历平衡二叉搜索树class Solution: def balanceBST(self, root: TreeNode) -> TreeNode: def inorder(node): if not node: return inorder(node.left) order.append原创 2020-12-25 11:56:39 · 357 阅读 · 0 评论 -
Leetcode 1443. Minimum Time to Collect All Apples in a Tree (python)
题目解法1:利用dfs,找出所有的在摘苹果的过程中会被访问的边。这些被访问的边数*2就是答案这种做法需要保存当前路径,当发现当前路径包含苹果时,将这些边加入访问列表。这样做的坏处在于,每条边可能被加入多次,意味着时间复杂度的增加,事实证明这种做法确实不都快,刚刚过TLE的线。但利用字典或者set,还是可以不重复的记录摘苹果时需要被访问的边class Solution: def minTime(self, n: int, edges: List[List[int]], hasApple: L原创 2020-11-22 10:51:11 · 375 阅读 · 0 评论 -
Leetcode 1466. Reorder Routes to Make All Paths Lead to the City Zero (python)
题目解法:这道题目有个关键是,图里面n个节点,有n-1条边,而且题目也提示了可以看作是一棵树。关键在于理解每个节点都指向0代表什么:代表的是每个以0作为根节点,每个叶节点到根节点的路径都是子节点指向父节点的。比如第一个例子,只需要保证2到0和5到0这两条路径都是子节点指向父节点的。而对于connections里面的边,一定是有一个在树里是父节点,另一个是子节点,我们只需要保证这两个节点的相对顺序即可,那么解法就很清晰了:从0节点出发,利用BFS或者DFS遍历一遍树,并且保存每个节点被访问的相对顺序原创 2020-11-18 14:09:27 · 303 阅读 · 0 评论 -
Leetcode 1519. Number of Nodes in the Sub-Tree With the Same Label (python)
题目解法:这个题目需要好好理解,首先题目没有给根几点,而只是给了根节点的值。同时提供的边是没有方向的,可能是parent指向child,也可以是child指向parent。因为只提供了根节点的值和边,所以我们只能通过BFS来遍历整棵树,通过一个visited数组保证访问方向是从parent到child的。同时关于我们要求的答案,需要maintain一个count数组,因为都是lowercase,所以每行26的长度即可,这样方便后续的更新同时这边利用了树形递归的方法,从child节点到parent原创 2020-11-05 10:40:14 · 375 阅读 · 0 评论 -
Leetcode 1530. Number of Good Leaf Nodes Pairs (python)
题目解法:将树转换成图,然后从每个leaf node开始进行BFS。虽然这种解法没有这么快,但是我觉得很标准。所有判断有没有出现过的node都用字典实现O(1)的查找时间复杂度要注意两点:不同的节点值可能会相同(nodeA,nodeB)和(nodeB,nodeA)算一个pair# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None原创 2020-11-05 06:57:41 · 402 阅读 · 1 评论 -
Leetcode 863. All Nodes Distance K in Binary Tree (python)
Leetcode 863. All Nodes Distance K in Binary Tree题目解析:题目解析:这道题看到固定距离寻找这种限制条件,第一个想到的就应该是BFS。所以这道题目变成了两个部分:将树转化为图,每个节点指向parent节点和左右子节点从target节点出发,BFS寻找特定距离的点值得注意的是,这边给的target是节点,所以不需要额外去寻找target节点这边将树转化为图有两种做法,一种是利用树的性质,将parent直接作为树节点的属性,代码如下:cla原创 2020-10-15 10:27:49 · 317 阅读 · 0 评论 -
Leetcode 98. Validate Binary Search Tree (python)
Leetcode 98. Validate Binary Search Tree题目解法:题目解法:首先二叉搜索树的定义熟悉一下。对于一个节点,他可能出现这样的情况:是父节点的左节点,又是祖父节点的右子树中的节点 (意味着这个节点要比父节点小,但是要比祖父节点大)是父节点的右节点,又是祖父节点左子树中的节点 (意味着这个节点要比父节点大,但是要比祖父节点小)从上面的情况分析可以看出,对于一个节点,有一个上边界和下边界,而且这个边界会根据节点的深度变化不断更新。这就是解法的思路class原创 2020-10-15 09:59:45 · 305 阅读 · 0 评论 -
Leetcode Binary Tree Preorder, inorder, postorder Traversal (python)
Leetcode Binary Tree Preorder, inorder, postorder Traversal题目解析:题目https://leetcode.com/problems/binary-tree-preorder-traversal/https://leetcode.com/problems/binary-tree-inorder-traversal/submissions/https://leetcode.com/problems/binary-tree-postorder-t原创 2020-10-08 12:44:30 · 168 阅读 · 0 评论 -
Leetcode 1609. Even Odd Tree (python)
Leetcode 1609. Even Odd Tree题目解法1:BFS解法2:DFSfollow题目解法1:BFS本质上是个level order traversal再加一些判断即可,BFS版本的解法中需要额外的空间class Solution: def isEvenOddTree(self, root: TreeNode) -> bool: q = collections.deque() q.append(root) levels原创 2020-10-07 09:38:00 · 348 阅读 · 0 评论 -
Leetcode 1522. Diameter of N-Ary Tree (python+cpp)
Leetcode 1522. Diameter of N-Ary Tree题目:解法:题目:解法:这是543的follow up,解法几乎是一样的,只不过左子树和右子树的深度替换成所有子树里面深度最大的两个class Solution: def diameter(self, root: 'Node') -> int: """ :type root: 'Node' :rtype: int """ def g原创 2020-09-07 06:41:54 · 407 阅读 · 0 评论 -
Leetcode 124. Binary Tree Maximum Path Sum (python+cpp)
Leetcode 124. Binary Tree Maximum Path Sum题目解法:recursion题目解法:recursion参考leetcode官方解法:https://leetcode.com/problems/binary-tree-maximum-path-sum/solution/关键点在于两个,一个是用全局的变量来保存最大值,另一个点在于如何计算以某个节点为根节点所能得到的路径最大值。left_gain和right_gain得到的方式也很需要思考python代码:c原创 2020-09-03 12:16:11 · 279 阅读 · 0 评论 -
Leetcode 113. Path Sum II (python+cpp)
Leetcode 113. Path Sum II题目:解法:类似backtracking题目:解法:类似backtracking在path sum I的基础上稍作改动即可class Solution: def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]: def helper(node,curr_sum,curr_path): if not node:原创 2020-09-03 08:51:42 · 169 阅读 · 0 评论 -
Leetcode 112. Path Sum (python+cpp)
Leetcode 112. Path Sum题目:解法:简单递归题目:解法:简单递归class Solution: def hasPathSum(self, root: TreeNode, sum: int) -> bool: def helper(node,curr_sum): if not node.left and not node.right: return curr_sum+node.val == sum原创 2020-09-03 08:46:49 · 173 阅读 · 0 评论 -
Leetcode 404. Sum of Left Leaves (python+cpp)
Leetcode 404. Sum of Left Leaves题目解析:题目解析:在递归的时候传一个是不是左节点的参数即可python:class Solution: def sumOfLeftLeaves(self, root: TreeNode) -> int: def helper(node,isleft): if not node: return if isleft and原创 2020-07-13 01:21:02 · 153 阅读 · 0 评论 -
Leetcode 572. Subtree of Another Tree (python+cpp)
Leetcode 572. Subtree of Another Tree题目解法:双层递归题目解法:双层递归虽然这道题目标的easy,但是其实蛮考对于递归的理解的。最直观的解法是双层递归,外层递归遍历节点,内层递归判断当前遍历的节点形成的子树是否与目标树相同。外层循环只要有一个节点符合情况即可,二内层循环需要每个节点都相同才行python:class Solution: def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:原创 2020-07-10 09:46:46 · 237 阅读 · 0 评论 -
Leetcode 226. Invert Binary Tree (python+cpp)
Leetcode 226. Invert Binary Tree题目解法:递归题目解法:递归先交换,再递归pythonclass Solution: def invertTree(self, root: TreeNode) -> TreeNode: if not root: return root.left,root.right = root.right,root.left self.invertTree(ro原创 2020-07-07 11:22:06 · 88 阅读 · 0 评论 -
Leetcode 617. Merge Two Binary Trees (python+cpp)
Leetcode 617 617. Merge Two Binary Trees题目解法:递归题目解法:递归先判断两边节点情况,然后进行递归构造子节点python:class Solution: def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode: if not t1: return t2 if not t2: return t1原创 2020-07-07 11:18:24 · 138 阅读 · 0 评论 -
Leetcode 669. Trim a Binary Search Tree (python+cpp)
Leetcode 669. Trim a Binary Search Tree题目解析:题目解析:如果当前节点在范围内,此节点不动,递归到下一层的左右子树否则,根据当前节点的范围,直接返回左子树或者右子树python代码如下:class Solution: def trimBST(self, root: TreeNode, L: int, R: int) -> TreeNode: def trim(node): if not node:原创 2020-07-05 09:53:19 · 150 阅读 · 0 评论 -
Leetcode 99. Recover Binary Search Tree (python+cpp)
Leetcode 99. Recover Binary Search Tree题目解析:题目解析:这道题目的解法有很多,但是我在这边只介绍一种比较基本的也最容易理解的方法。解这道题的关键在于,二叉查找树的中序遍历是一个单调递增的序列。所以把错误的二叉查找树复原之后,第一个错误位置的元素会比他后一个元素大,而第二个错误的元素会比他前面的元素小,根据这样的规律就可以找出两个元素,所以具体的步骤如下:将原树进行中序遍历找出被交换的两个元素遍历原树,修改相应两个位置的值python代码如下:原创 2020-07-05 09:26:27 · 184 阅读 · 0 评论 -
Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal (python+cpp)
Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal题目解析题目解析观察前序遍历和中序遍历可以发现,前序遍历的第一个节点是根节点,从中序遍历中找到这个节点的位置,这个节点左边是左子树,右遍是右子树。根据这样的规律,我们可以用前序遍历的顺序作为索引,将中序遍历进行不断切分来构造树。递归函数的详情如下:新建一个全局变量preindex,代表在前序遍历中的位置,在递归过程中每次递归这个变量加1递归函数接受两个参原创 2020-06-30 09:58:08 · 241 阅读 · 0 评论 -
Leetcode 637. Average of Levels in Binary Tree (python+cpp)
Leetcode 637. Average of Levels in Binary Tree题目解法:题目解法:这其实就是层级遍历,一般用bfs实现,两个循环嵌套,内循环负责遍历一层上所有节点python代码如下:class Solution: def averageOfLevels(self, root: TreeNode) -> List[float]: q = collections.deque(); q.append(root)原创 2020-06-30 09:45:48 · 185 阅读 · 0 评论 -
Leetcode 1110. Delete Nodes And Return Forest (python+cpp)
Leetcode 1110. Delete Nodes And Return Forest 题目解法:题目解法:这道题目对于加深递归的理解很有好处。而且最近google面试出现的概率好像比较高。肯定是需要构造一个遍历树的函数,关键是这个函数里面返回值以及操作应该怎么进行。很明显的是分成两种情况:1.当前节点在删除列表里需要被删除,那么有两件事需要做,一件事是这个节点与他的父节点的连接需要切断,换言之父节点相对应这个节点的指针需要变为空;第二件事是需要把这个节点的所有子节点加入forest中。2.当前原创 2020-06-29 10:48:16 · 255 阅读 · 0 评论 -
Leetcode 101. Symmetric Tree (python+cpp)
Leetcode 101. Symmetric Tree题目解法:题目解法:判断一个树是否对称等价于判断左右子树是否对称,一般用四步法解决:如果两个子树都为空指针,则它们相等或对称如果两个子树只有一个为空指针,则它们不相等或不对称如果两个子树根节点的值不相等, 则它们不相等或不对称根据相等或对称要求,进行递归处理python代码如下:class Solution: def isSymmetric(self, root: TreeNode) -> bool:原创 2020-06-29 10:00:06 · 174 阅读 · 0 评论 -
Leetcode 543. Diameter of Binary Tree (python+cpp)
Leetcode 543. Diameter of Binary Tree题目解法:题目解法:需要用到求树的深度,可以参考Leetcode Maximum Depth of Binary Tree 。 根据这边树的直径的定义应该是等于左边子树的深度和右边子树的深度。因为这边直径的定义是路程,而前面深度的定义是节点数。所以操作步骤其实跟求深度几乎一致,只是在求深度的时候更新直径的值就阔以了python代码如下:class Solution: def diameterOfBi原创 2020-06-25 10:08:58 · 305 阅读 · 0 评论 -
Leetcode 437. Path Sum III (python+cpp)
Leetcode 437. Path Sum III题目错误解法:正确解法:题目错误解法:这道题目坑爹的地方在于路径可以不从根节点开始。刚看到题目的时候天真的以为是从根节点开始,于是就有了下面的错误解法:class Solution: def pathSum(self, root: TreeNode, sum: int) -> int: self.count = 0 def count_path(root,curr_sum):原创 2020-06-25 09:59:50 · 259 阅读 · 0 评论 -
Leetcode 110. Balanced Binary Tree (python+cpp)
Leetcode 110. Balanced Binary Tree题目解析:题目解析:自上而下,到每个节点队规判断左右两边是否平衡,不平衡立刻返回false,平衡则递归判断最有两边子树是否平衡。判断平衡方法为直接求出两边的深度python代码如下:class Solution: def isBalanced(self, root: TreeNode) -> bool: def get_depth(root): return 1+max(ge原创 2020-06-24 10:01:33 · 339 阅读 · 0 评论 -
Leetcode 104. Maximum Depth of Binary Tree (python+cpp)
Leetcode 104. Maximum Depth of Binary Tree题目解析:题目解析:题目很简单,不多说,树的基本用法还是要记录一下一板一眼的python代码如下:class Solution: def maxDepth(self, root: TreeNode) -> int: if not root: return 0 left_depth = right_depth = 0 if roo原创 2020-06-24 09:54:59 · 218 阅读 · 0 评论