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.path=[]
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
self.traverse(root)
n=len(self.path)
for i in range(1,n):
if abs(self.path[i-1]-self.path[i])<self.min_diff:
self.min_diff=abs(self.path[i-1]-self.path[i])
return self.min_diff
def traverse(self,root):
if root is None:
return
self.traverse(root.left)
self.path.append(root.val)
self.traverse(root.right)
501.二叉搜索树中的众数
总结一下这道题我所学到的字典知识:
- 根据字典value的大小进行排序
sorted_dict=dict(sorted(my_dict.items(),key=lamda item:item[1])) #item[0]指的是键,item[1]指的是值
- 寻找字典中最大值对应的键
key_with_max_value=max(my_dict,key=my_dict.get) #只找最大值中的第一个
keys_with_max_value=[key for key,value in my_dict.items() if value==max_value) #找到最大值的所有键
# 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.cnt={}
def findMode(self, root: Optional[TreeNode]) -> List[int]:
self.traverse(root)
max_num_value=max(self.cnt.values())
keys=[key for key,value in self.cnt.items() if value==max_num_value]
return keys
def traverse(self,root):
if root is None:
return
self.traverse(root.left)
self.cnt[root.val]=self.cnt.get(root.val,0)+1
self.traverse(root.right)
236.二叉树的最近公共祖先
这道题有两种情况:
- 两个节点其中之一就是最近公共祖先:直接返回根节点
- 两个节点都在最近公共祖先节点的子树里面,那么就遍历查找,在后序判断左右节点是否非空
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
return self.find(root, p.val, q.val)
# 在二叉树中寻找 val1 和 val2 的最近公共祖先节点
def find(self, root: 'TreeNode', val1: int, val2: int) -> 'TreeNode':
if root is None:
return None
# 前序位置
if root.val == val1 or root.val == val2:
# 如果遇到目标值,直接返回
return root
left = self.find(root.left, val1, val2)
right = self.find(root.right, val1, val2)
# 后序位置,已经知道左右子树是否存在目标值
if left is not None and right is not None:
# 当前节点是 LCA 节点
return root
return left if left is not None else right