最小绝对差
1.申请一个数组,比较两两之间最小的差值
def getresult3(self,node:TreeNode):
self.nums=[]
self.getMinimumDifference(node)
mindifference=float('inf')
for i in range(len(self.nums)-1):
mind=self.nums[i+1]-self.nums[i]
if mindifference>mind:
mindifference=mind
return mindifference
def getMinimumDifference(self,node:TreeNode):
if node is None:
return
self.getMinimumDifference(node.left)
self.nums.append(node.val)
self.getMinimumDifference(node.right)
2.不申请数组,利用双指针解法
def getMinimumDifference2(self,node:TreeNode):
self.pre=None # 双指针解法,当前node与pre的差值
self.result=float('inf')
def dfs(node:TreeNode):
if node is None:
return
# 中序遍历:左
dfs(node.left)
# 中的逻辑,让result保存最小的差值
if self.pre is not None:
self.result=min(self.result,abs(node.val-self.pre.val))
# 此时pre等于当前current节点,而current节点已经回溯到上一层
self.pre=node
# 右
dfs(node.right)
二叉搜索树中的众数
1.不申请额外空间,动态更新result
def getMaxFrequency(self,node:TreeNode):
self.result=[] # z存放众数的结果集
self.times=1
self.maxtimes=0
self.pre=None
def dfs(node:TreeNode):
if node is None:return
# 左,先一直遍历到最左侧
dfs(node.left)
# 中,中间的处理逻辑,判断一个数是不是众数
if self.pre :
# 如果两个数相等,那出现的次数就递增
if node.val==self.pre.val:
self.times+=1
else:
self.times=1
# 如果两个数不相等,并且遍历到一个数的数量超过了另一个数的数量
if self.maxtimes< self.times:
self.maxtimes=self.times
self.result.clear()
self.result.append(self.pre.val)
# 如果两个数的数量相等,那就把两个数都保存在result里,不需要清空
elif self.maxtimes==self.times:
self.result.append(node.val)
self.pre=node
# 右
dfs(node.right)
return self.result
最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
class Solution:
def lowestCommonAncestor(self, root, p, q):
# 终止条件是如果根节点就包含
if root == q or root == p or root is None:
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if left is not None and right is not None:
return root
if left is None and right is not None:
return right
elif left is not None and right is None:
return left
else:
return None