最小绝对差
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=mindreturn mindifferencedef getMinimumDifference(self,node:TreeNode):if node is None:returnself.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)
二叉搜索树中的众数
有序二叉树里面的众数,因为是有序的,也就意味着只有相邻两个元素的值会相等,所以才能通过依次比较相邻的两个元素值是否相同的方式来递增times
1.不申请额外空间,动态更新result
def getMaxFrequency(self,node:TreeNode):self.result=[] # z存放众数的结果集self.times=1self.maxtimes=0self.pre=Nonedef dfs(node:TreeNode):if node is None:return# 左,先一直遍历到最左侧dfs(node.left)# 中,中间的处理逻辑,判断一个数是不是众数if self.pre :# 如果两个数相等,那出现的次数就递增if node.val==self.pre.val:self.times+=1else:self.times=1# 如果两个数不相等,并且遍历到一个数的数量超过了另一个数的数量if self.maxtimes< self.times:self.maxtimes=self.timesself.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。因为根据定义最近公共祖先节点可以为节点本身。
思路:因为要求深度最大的公共祖先,那采用后序遍历,如果一个节点的左右子树都出现了p和q,那该节点就是最近公共祖先,如果左子树或右子树其中一个没有出现p或q,那就往上返回,继续搜索。
class Solution:def lowestCommonAncestor(self, root, p, q):# 终止条件是如果根节点就包含if root == q or root == p 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 rootif left is None and right is not None:return rightelif left is not None and right is None:return leftelse: return None