一、题目内容 简单

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

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

假定 BST 满足如下定义:

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

示例1:

输入:root = [1,null,2,2] 输出:[2] 17. 二叉搜索树中的众数(501) - 图1

示例2:

输入:root = [0] 输出:[0]

提示:

  • 树中节点的数目在范围 [1, 104] 内
  • -105 <= Node.val <= 105

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

二、解题思路

其实二叉搜索树,就当是有序数组,有序数组怎么找众数啊?就从左到右遍历呗,找出重复最多的。
二叉搜索树的中序遍历,就相当于有序数组的遍历。

三、具体代码

  1. /**
  2. * @param {TreeNode} root
  3. * @return {number[]}
  4. */
  5. var findMode = function (root) {
  6. let result = []
  7. let count = 0
  8. let maxCount = 0
  9. const stack = []
  10. let cur = root, pre = null
  11. while (cur || stack.length) {
  12. if (cur) {
  13. stack.push(cur)
  14. cur = cur.left
  15. } else {
  16. cur = stack.pop()
  17. if (pre) {
  18. if (pre.val === cur.val) count++
  19. else count = 1
  20. } else {
  21. count = 1
  22. }
  23. if (count > maxCount) {
  24. result = [cur.val]
  25. maxCount = count
  26. } else if (count === maxCount) {
  27. result.push(cur.val)
  28. }
  29. pre = cur
  30. cur = cur.right
  31. }
  32. }
  33. return result
  34. };

四、其他解法

递归法

  1. /**
  2. * @param {TreeNode} root
  3. * @return {number[]}
  4. */
  5. var findMode = function (root) {
  6. let result = []
  7. let pre = null
  8. let count = 0, maxCount = 0
  9. const traversal = (node) => {
  10. if (!node) return
  11. traversal(node.left)
  12. if (pre !== null && pre === node.val) {
  13. count++
  14. } else {
  15. count = 1
  16. }
  17. pre = node.val
  18. if (count > maxCount) {
  19. result = [node.val]
  20. maxCount = count
  21. } else if (count === maxCount) {
  22. result.push(node.val)
  23. }
  24. traversal(node.right)
  25. }
  26. traversal(root)
  27. return result
  28. };