给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
Given the root of a binary search tree (BST) with duplicates, return all the mode(s) (i.e., the most frequently occurred element) in it.
If the tree has more than one mode, return them in any order.
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than or equal to the node’s key.
- The right subtree of a node contains only nodes with keys greater than or equal to the node’s key.
- Both the left and right subtrees must also be binary search trees.
示例 1:
输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
提示:
- 树中节点的数目在范围 [1, 104] 内
- -105 <= Node.val <= 105
解题思路
二叉树中序遍历性质:一颗二叉树的中序遍历序列是一个非递减的有序序列。我们可以发现重复出现的数字,一定是一个连续出现的
base 为当前的数字
number 为当前数字对应出现的次数
maxNumber 为出现最多的次数
answer 为出现的众数数组
首先更新 base 和 count:
- 如果该元素和 base 相等,那么 number 自增 1;
- 否则将 base 更新为当前数字,number 复位为 1。
然后更新 maxNumber:
- 如果 number=maxNumber,那么说明当前的这个数字(base)出现的次数等于当前众数出现的次数,将 base 加入answer 数组;
- 如果 number>maxNumber,那么说明当前的这个数字(base)出现的次数大于当前众数出现的次数,因此,我们需要将 maxNumber 更新为number,清空 answer 数组后将base 加入 answer 数组。
我们可以把这个过程写成一个 update 函数。这样我们在寻找出现次数最多的数字的时候就可以省去一个哈希表带来的空间消耗。
var findMode = function (root) {
let base = 0, number = 0, maxNumber = 0, answer = []
var getAnswer = function (value) {
if (value === base) {
++number
} else {
number = 1
base = value
}
if (number === maxNumber) {
answer.push(base)
} else if (number > maxNumber) {
maxNumber = number
answer = [base]
}
}
var dfs = function (root) {
if (!root) return
dfs(root.left)
getAnswer(root.val)
dfs(root.right)
};
dfs(root)
return answer
};
//中序遍历的方法
var dfs = function (root) {
if (!root) return
dfs(root.left)
getAnswer(root.val)
dfs(root.right)
};
leetcode:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/