目录
530.二叉搜索树的最小绝对差
思路
代码
501.二叉搜索树中的众数
思路
代码
236. 二叉树的最近公共祖先
思路
代码
530.二叉搜索树的最小绝对差
需要领悟一下二叉树遍历上双指针操作,优先掌握递归题目链接/文章讲解:代码随想录
视频讲解:二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差_哔哩哔哩_bilibili
思路
二叉搜索树的一个很重要的特性——中序遍历是一个有序的递增数组。有序递增数组求两个数的最小差值那不是有手就行。
代码
class Solution:def __init__(self):self.vec = []def traversal(self, root):if root is None:returnself.traversal(root.left)self.vec.append(root.val) # 将二叉搜索树转换为有序数组self.traversal(root.right)def getMinimumDifference(self, root):self.vec = []self.traversal(root)if len(self.vec) < 2:return 0result = float('inf')for i in range(1, len(self.vec)):# 统计有序数组的最小差值result = min(result, self.vec[i] - self.vec[i - 1])return result
501.二叉搜索树中的众数
和 530差不多双指针思路,不过 这里涉及到一个很巧妙的代码技巧。题目链接/文章讲解:代码随想录
代码随想录视频讲解:不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数_哔哩哔哩_bilibili
思路
这里首次引入了pre指针,采用的还是二叉树的中序遍历,每次和前一个数进行比较,如果一样,count就+1,每层遍历时在遍历中间节点后更新出现次数最大的数,注意每次更新最大的数需要把原来的res[ ] 清空,因为原来里面装的不是出现频率最大的数了。
代码
from collections import defaultdict
from typing import Optional, Listclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:def __init__(self):self.res = []self.count = 0self.maxcount = 0self.pre = Nonedef findMode(self, root: Optional[TreeNode]) -> List[int]:self.count = 0self.maxcount = 0self.pre = Noneself.res = []self.traversal(root)return self.resdef traversal(self, cur):if not cur:return None# 左self.traversal(cur.left)# 中if not self.pre:self.count = 1elif self.pre.val == cur.val:self.count += 1else:self.count = 1self.pre = curif self.count > self.maxcount: # 当前计数频率大于最大值频率,更新max,清空resself.maxcount = self.countself.res = []if self.count == self.maxcount:self.res.append(cur.val)# 右self.traversal(cur.right)return
236. 二叉树的最近公共祖先
本题其实是比较难的,可以先看我的视频讲解题目链接:
代码随想录
视频讲解:自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先_哔哩哔哩_bilibili
思路
这种题就是我看着好像知道什么个原理,实际上让我写写不了一点。。。(每日崩溃1/1)
这道题使用的是后序遍历,如果遍历到当前节点就是p或者q就返回当前节点,层层往回传,最后会传到根节点。(因为是后序遍历,哪怕找到了答案也要遍完的)(我知道我这么讲大家根本听不懂,所以点开视频看吧,Carl哥讲的超级nice,再配合代码应该可以看懂)
代码
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneclass Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':if root == p or root == q or root is None:return rootleft = self.lowestCommonAncestor(root.left,p,q)right = self.lowestCommonAncestor(root.right,p,q)if left is not None and right is not None:return rootelif left is None and right is not None :return rightelif left is not None and right is None:return leftelse:return None