二叉搜索树的最小绝对差
思路:记住二叉搜索树的特性,中序遍历是有序数组,所以我们直接对树做一次中序遍历,然后对数组中的node进行一次循环遍历不断获取最小值就行了,这里需要创建一个max_value拿来作比较
对于中序遍历这里就不多阐述了,奥这里我踩了好几次的坑,就是我们储存遍历的数组应该定义在主函数中,不然每次遍历都是空数组
代码:
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
res = []
self.inorder(root,res)
max_value = float('inf')
for i in range(len(res)-1):
max_value = min(abs(res[i]-res[i+1]),max_value)
return max_value
def inorder(self,node,res):
if not node:
return None
self.inorder(node.left,res)#左
res.append(node.val)#中
self.inorder(node.right,res)#右
501. 二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
思路:这里再再再次强调!!!!遍历二叉搜索树即为遍历有序数组!!!!!!那么这个问题就转化成了 递增数组中找出 出现频率最多次数的元素!既然与元素出现次数相关 那就再用一个哈希表来记录即可!
代码:
def findMode(self, root: Optional[TreeNode]) -> List[int]:
res = []
self.inorder(root,res)
res_map = {}
for i in range(len(res)):
if res[i] not in res_map:
res_map[res[i]] = 1
else:
res_map[res[i]] += 1
maxVal = max(res_map.values())
ans = []
for item,val in res_map.items():
if val>=maxVal:
ans.append(item)
return ans
def inorder(self,node,res):
if not node:
return None
self.inorder(node.left,res)
res.append(node.val)
self.inorder(node.right,res)
236. 二叉树的最近公共祖先
思路:
首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。 即情况一:
题目强调:二叉树节点数值是不重复的,而且一定存在 q 和 p。
如果当p或者q本身就是一个根节点呢?那就是情况二:
因为遇到 q 或者 p 就返回,这样也包含了 q 或者 p 本身就是 公共祖先的情况
代码:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:
return None
if root==p or root==q:
return root
left = self.lowestCommonAncestor(root.left,p,q)
right = self.lowestCommonAncestor(root.right,p,q)
if left!=None and right==None:
return left
elif left==None and right!=None:
return right
elif left!=None and right!=None:
return root
else:
return None