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

题目:530.二叉搜索树的最小绝对差

初始思路

题目给的很特殊,是个二叉搜索树,根据昨天的98.验证二叉搜索树可以知道,可以把二叉搜索树转变成一个有序递增的数组,然后在这个数组上求差值。

代码

  1. var getMinimumDifference = function (root) {
  2. let arr = []
  3. const buildArr = (root) => {
  4. if (root) {
  5. buildArr(root.left)
  6. arr.push(root.val)
  7. buildArr(root.right)
  8. }
  9. }
  10. buildArr(root)
  11. // arr数组是逐渐递增的
  12. let min = arr[arr.length - 1]
  13. for (let i = 1; i < arr.length; i++){
  14. if (min > arr[i] - arr[i - 1]){
  15. min = arr[i] - arr[i - 1]
  16. }
  17. }
  18. return min
  19. };

感想

  1. 果然和我想的一样~利用了二叉搜索树的有序性。
  2. 在遍历数组的时候,我们已知了数组是非递减的,可以确定差值就存在相邻的两个元素之间,所以遍历的时候两个相减就可以了。

Leetcode 501.二叉搜索树中的众数

题目:501.二叉搜索树中的众数

初始思路

按照上题的思路,进行遍历获得arr,然后映射到map上,统计出现最多的字符。

代码

  1. var findMode = function (root) {
  2. // 使用辅助map
  3. let map = new Map()
  4. // 递归
  5. const traverTree = (root) => {
  6. if (!root) return
  7. traverTree(root.left)
  8. let count = map.has(root.val) ? map.get(root.val) + 1 : 1
  9. map.set(root.val, count)
  10. traverTree(root.right)
  11. }
  12. traverTree(root)
  13. let max = map.get(root.val)
  14. // 因为不一定只有一个众数,所以返回一个数组
  15. let res = []
  16. for (let [key, value] of map) {
  17. // 如果当前值等于最大出现次数就在res增加
  18. if (value === max) {
  19. res.push(key)
  20. }
  21. // 如果value的值大于原本的maxCount就清空res的所有值,因为找到了更大的
  22. if (value > max) {
  23. res = []
  24. max = value
  25. res.push(key)
  26. }
  27. }
  28. return res
  29. };
  1. var findMode = function (root) {
  2. // 不使用额外空间,使用中序遍历,设置出现最大次数初始值为1
  3. let count = 0, maxCount = 1;
  4. let pre = root, res = [];
  5. // 1.确定递归函数及函数参数
  6. const travelTree = function (cur) {
  7. // 2. 确定递归终止条件
  8. if (cur == null) {
  9. return;
  10. }
  11. travelTree(cur.left);
  12. // 3. 单层递归逻辑
  13. if (pre.val === cur.val) {
  14. count++;
  15. } else {
  16. count = 1;
  17. }
  18. pre = cur;
  19. if (count === maxCount) {
  20. res.push(cur.val);
  21. }
  22. if (count > maxCount) {
  23. res = [];
  24. maxCount = count;
  25. res.push(cur.val);
  26. }
  27. travelTree(cur.right);
  28. }
  29. travelTree(root);
  30. return res;
  31. };

感想

  1. 思路一样,但是在进行比较最大值的时候要灵活使用map,同时res是一个数组,不是一个数。
  2. 不使用map的没咋看懂。

Leetcode 236.二叉树的最近公共祖先

题目:236.二叉树的最近公共祖先 讲解:https://www.bilibili.com/video/BV1jd4y1B7E2

初始思路

没啥思路

代码

  1. var lowestCommonAncestor = function (root, p, q) {
  2. // 后序遍历
  3. const travelTree = (root, p, q) => {
  4. if (root == null || root === p || root === q) {
  5. return root
  6. }
  7. // 处理逻辑
  8. let left = travelTree(root.left, p, q)
  9. let right = travelTree(root.right, p, q)
  10. if (left != null && right != null) {
  11. // 如果左右都有返回的话,说明这个点就是公共祖先
  12. return root
  13. }
  14. // 返回左右子树的值
  15. if (left == null && right != null) {
  16. return right
  17. } else if (left != null && right == null) {
  18. return left
  19. } else {
  20. return null
  21. }
  22. }
  23. return travelTree(root, p, q)
  24. };

感想

  1. 视频讲解很清晰,把思路看懂之后代码就可以看明白了。通过后序遍历实现回溯,如果在子树中匹配到了p或者q,就向祖先返回这个值,如果左右子树都返回了非空值,说明这个点就是公共祖先。
  2. 图示
    image.png
  3. 原来已经打卡20天了吗,真快啊!什么时候能拿到offer呢。