530.二叉搜索树的最小绝对差
只要有序(指二叉搜索数的数据排布),就有双指针的出现
思路比较简单,就是中序遍历,拿遍历的‘后一个节点(cur指针)减前一个节点(pre指针)’
# 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):#作为dfs的初始输入,但是在dfs里面已经不方便做初始化了
self.pre = None
self.res = float('inf')
def dfs(self, root: Optional[TreeNode]):#
if not root:
return
cur = root
self.dfs(root.left)
if self.pre is not None:#pre指针不为空
self.res = min(self.res,cur.val-self.pre.val)
self.pre = cur
self.dfs(root.right)
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
if not root:
return
self.dfs(root)#求res
return self.res
501.二叉搜索树中的众数
和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.count = 0
self.maxcount = 0
self.pre = None
self.res = []
def dfs(self,root):
if not root:
return
self.dfs(root.left)#中序遍历
cur = root
if self.pre is None:
self.count = 1
if self.pre is not None:
if cur.val == self.pre.val:
self.count += 1#相等则开始计数
else:
self.count = 1#不等则重新清零
if self.maxcount < self.count:#元素更新
self.maxcount = self.count
self.res = [cur.val]#整理res
elif self.maxcount == self.count:#元素添加
self.res.append(cur.val)
#else:#不可以清空,否则之前得到的众数会被清空,只记录最后一个众数
# self.count = 1#计数清零后进行下一个元素频率统计
self.pre = cur
self.dfs(root.right)
def findMode(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return
self.dfs(root)
return self.res
236. 二叉树的最近公共祖先
难题先跳过,考不到难题