530.二叉搜索树的最小绝对差 - 🔗
讲解 - 🔗
💡跟昨天的用双指针法来中序遍历二叉树一样。刚开始不是特别能理解,用编译器自己跑一遍就好了。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def __init__(self):
self.min_diff = float('inf')
self.pre = None
def traversal(self, root):
if not root:
return
left = self.traversal(root.left) # 左
if self.pre: # 中
self.min_diff = min(abs(self.pre.val - root.val), self.min_diff)
self.pre = root
right = self.traversal(root.right) # 右
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
# 因为是二叉搜索树,所以按照中序遍历得到的节点值依次变大,所以只需要用双指针按顺序遍历二叉树即可
self.traversal(root)
return self.min_diff
501.二叉搜索树中的众数 - 🔗
讲解 - 🔗
💡比较重要的操作是单层递归里面判断是否是众数。用一个数组res去记录结果。当某一个数字遍历完成,与self.max_times
比较,如果比self.max_times
大,则用该数字的出现频率self.times
去更新self.max_times
,并将res清空,然后将数字值append到res中;如果相等,则无需更新self.max_times
和清空res,但仍需要在res后append数字值。
需要注意的是,在遍历结束后,最后一组数字值没有被比较过,需要额外比较。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def __init__(self):
self.res = []
self.pre = None
self.max_times = 0
self.times = 1
def traversal(self, cur):
if not cur:
return
left = self.traversal(cur.left)
if self.pre:
# cur 与 pre 节点值相等
if self.pre.val == cur.val:
self.times += 1
# 判断是否为众数
elif self.times > self.max_times:
self.res.clear()
self.res.append(self.pre.val)
self.max_times = self.times # 更新max_times值
self.times = 1
elif self.times == self.max_times:
self.res.append(self.pre.val)
self.times = 1
else:
self.times = 1
self.pre = cur
right = self.traversal(cur.right)
def findMode(self, root: Optional[TreeNode]) -> List[int]:
# 根据BST的定义,当pre和cur的节点值不一致时,说明cur已经移到了下一个数,则上一个数的频率可以进行结算
self.traversal(root)
if self.times > self.max_times:
self.res.clear()
self.res.append(self.pre.val)
self.max_times = self.times # 更新max_times值
elif self.times == self.max_times:
self.res.append(self.pre.val)
return self.res