今天做的都是二叉搜索树,主要解题思路
class Solution:
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
# 二叉搜索树
# 最小差值
# 1. 中序遍历转换为数组+求差
self.diff = []
self.traversal(root)
return min(self.diff)
# 返回最小值的话,需要知道左的最大值和右的最小值
def traversal(self, root):
if not root:
return []
left = self.traversal(root.left)
right = self.traversal(root.right)
if len(left) > 0: self.diff.append(root.val - left[-1])
if len(right) > 0: self.diff.append(right[0] - root.val)
return left + [root.val] + right
class Solution:
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
# 二叉搜索树
# 最小差值
# 1. 中序遍历转换为数组+求差
self.diff = []
self.pre = None
self.cur = root
self.result = float('inf')
self.traversal(root)
return self.result
# 返回最小值的话,需要知道左的最大值和右的最小值
def traversal(self, root):
if not root:
return []
self.traversal(root.left)
if self.pre:
self.result = min(root.val - self.pre.val, self.result)
self.pre = root
self.traversal(root.right)
class Solution:
def findMode(self, root: Optional[TreeNode]) -> List[int]:
# 双指针的话,记录前一个,如果一样的话count+1,并且和max_count做对比
self.pre = None
self.max_count = 1
self.count = 1
self.res = []
self.traversal(root)
# print(self.max_count)
return self.res
def traversal(self, cur):
if cur is None:
return
self.traversal(cur.left)
print(self.pre, cur.val)
if self.pre:
# print(self.pre.val, cur.val)
if self.pre.val == cur.val:
self.count += 1
else:
self.count = 1
if self.count > self.max_count:
self.res = [cur.val]
self.max_count = self.count
elif self.count == self.max_count:
self.res.append(cur.val)
else: self.res = [cur.val]
self.pre = cur
self.traversal(cur.right)
max_freq = max(freq_map.values())
for key, freq in freq_map.items():
if freq == max_freq:
result.append(key)
return result
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
self.p = p
self.q = q
self.res = None
self.traversal(root)
return self.res
def traversal(self, cur):
if not cur:
return False, False
find_p_left, find_q_left = self.traversal(cur.left)
find_p_right, find_q_right = self.traversal(cur.right)
print(cur.val, find_p_left, find_p_right, find_q_left, find_q_right)
if (find_p_left or find_p_right or (cur.val == self.p.val)) and (find_q_left or find_q_right or (cur.val == self.q.val)):
if not self.res:
self.res = cur
return (find_p_left or find_p_right or (cur.val == self.p.val)), (find_q_left or find_q_right or (cur.val == self.q.val))
题解的写法:
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