每日一题-- 简单 -- 二叉搜索树中的众数(501)

87 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

题目:
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

示例 1:

image.png

输入:root = [1,null,2,2]
输出:[2]

🙇‍♂️ 感想:这周同样参加了力扣周赛。还是同样被打击了哎,双周赛写出两题就收手了,实在是中等题还是有点吃力。周赛简单题也是简单,中等题思路有了,但是时间复杂度太高了导致超时哎。每周都在找虐,导致这两周也不太想刷题了,感觉这样坚持下去真的有用吗,我是不是可以去干点别的事情可能更有意义。希望哪位大佬可以指点迷津。

本来今天都不想写题了,但是看了几集vue的源码解析视频,我也是看得云里雾里的,越看到后面越想睡觉,越不想看了,所以也是放弃挣扎了,来撸一道力扣题吧。

紧接上周继续刷树的题, 上周好像也没刷几道题

🙇‍♂️ 解题思路:这是一个二叉树找众数的题, 所以肯定要将所有出现过的值,都放入一个字典中,然后找出最大值二叉树遍历一般都是用到递归的方法,我这里是递归将所有的值都放到一个map中,然后在遍历这个map找到众数,即map中value的最大值

function findMode(root: TreeNode | null): number[] {
  if (!root.left && !root.right) return [root.val]
  let map = new Map()
  let result = []
  map.set(root.val, 1)
  if (root.left) {
    getAllNodes(root.left, map)
  }
  if (root.right) {
    getAllNodes(root.right, map)
  }
  let max = 0
  for (let [key, value] of map) {
    if (value > max) {
      result = [key]
      max = value
    } else if (value === max) {
      result.push(key)
    }
  }
  return result
};
function getAllNodes(root: TreeNode | null, map) {
  if (map.has(root.val)) {
    let num = map.get(root.val) + 1
    map.set(root.val, num)
  } else {
    map.set(root.val, 1)
  }
  if (root.left) {
    getAllNodes(root.left, map)
  }
  if (root.right) {
    getAllNodes(root.right, map)
  }
}