当前位置:   article > 正文

刷题第十八天 530.二叉搜索树最小绝对差 501. 二叉搜索中的众数 236. 二叉树最近公共祖先

刷题第十八天 530.二叉搜索树最小绝对差 501. 二叉搜索中的众数 236. 二叉树最近公共祖先

530. 二叉搜索树最小绝对差

  1. ### 变有序数组
  2. class Solution:
  3. def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
  4. def traversal(result, root):
  5. if not root:
  6. return
  7. traversal(result, root.left)
  8. result.append(root.val)
  9. traversal(result, root.right)
  10. result = []
  11. traversal(result, root)
  12. diff = result[1] - result[0]
  13. for i,val in enumerate(result):
  14. if i > 1 and result[i] - result[i - 1] < diff:
  15. diff = result[i] - result[i - 1]
  16. return diff
  17. ### 类似双指针,记录前指针的信息
  18. class Solution:
  19. def __init__(self):
  20. self.result = float('inf')
  21. self.pre = None
  22. def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
  23. if not root:
  24. return self.result
  25. left_min = self.getMinimumDifference(root.left)
  26. if self.pre:
  27. self.result = min(self.result, root.val - self.pre.val)
  28. self.pre = root
  29. right_min = self.getMinimumDifference(root.right)
  30. return min(left_min, right_min)

二叉搜索树中序遍历完就是一个有序数组,判断数组最小的相邻值 然后返回。

501. 二叉搜索中的众数

  1. class Solution:
  2. def __init__(self):
  3. self.result = []
  4. self.cur_count = 1
  5. self.max_count = 0
  6. self.pre = TreeNode(None)
  7. def findMode(self, root: Optional[TreeNode]) -> List[int]:
  8. if not root:
  9. return self.result
  10. left_result = self.findMode(root.left)
  11. if not self.pre:
  12. self.cur_count = 1
  13. if self.pre.val == root.val:
  14. self.cur_count += 1
  15. else:
  16. self.cur_count = 1
  17. self.pre = root
  18. if self.cur_count == self.max_count:
  19. self.result.append(root.val)
  20. if self.cur_count > self.max_count:
  21. self.max_count = self.cur_count
  22. self.result.clear()
  23. self.result.append(root.val)
  24. right_result = self.findMode(root.right)
  25. return left_result

中序遍历,主要在于中间的逻辑

1. 前序节点如果不存在,计数为1

2. 前序节点的值等于当前节点的呃值,计数+1

3. 其他情况 计数重新赋为1,并让前序节点更新为当前root

4. 判断目前的累计值是否等于最大计数,如果相等 收获结果,如果大于,则清空数组 ;更新最大计数并收获结果,最后返回result就行

没解决的问题:为什么把倒数后两个if的位置交换 答案就不对,想半天没想明白

解决了:因为如果大于的判断在前面 等于的判断在后面,那么max_count 已经等于cur_count 了之后在等于的判断里面又被加入一次

236. 最近公共祖先

  1. class Solution:
  2. def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
  3. if not root:
  4. return root
  5. if root == p or root == q :
  6. return root
  7. left = self.lowestCommonAncestor(root.left, p , q)
  8. right = self.lowestCommonAncestor(root.right, p, q)
  9. if not left and right:
  10. return right
  11. if not right and left:
  12. return left
  13. if right and left:
  14. return root
  15. else:
  16. return None

和计算深度类似,只要碰到节点相等了 就把当前节点返回 然后左右根接住,最后判断左右子树那边接到了 就继续向上返回,直到两边都接到了然后就返回root

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/430016
推荐阅读
相关标签
  

闽ICP备14008679号