题目链接:501. 二叉搜索树中的众数
题目描述
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2] 输出:[2]
示例 2:
输入:root = [0] 输出:[0]
提示:
- 树中节点的数目在范围
[1, 104]
内 -105 <= Node.val <= 105
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
文章讲解:代码随想录
视频讲解:不仅双指针,还有代码技巧可以惊艳到你! | LeetCode:501.二叉搜索树中的众数_哔哩哔哩_bilibili
题解1:递归法
思路:使用双指针,一个指针进行中序遍历,另一个指针指向前一个节点,记录元素的出现顺序,得出众数。
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var findMode = function(root) {
let res = []; // 结果数组
let pre = null; // 指向上一个节点
let maxCount = 1; // 最大出现次数
let count = 1; // 出现次数
const inorder = function (node) {
if (!node) {
return;
}
inorder(node.left); // 左
// 中
count = pre && node.val === pre.val ? count + 1 : 1;
if (count === maxCount) {
res.push(node.val);
} else if (count > maxCount) {
maxCount = count;
res = [node.val];
}
pre = node;
inorder(node.right); // 右
}
inorder(root);
return res;
};
分析:时间复杂度为 O(n),空间复杂度为 O(logn)。
题解2:迭代法
思路:中序遍历的迭代法。
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var findMode = function(root) {
let res = []; // 结果数组
let stack = [];
let pre = null; // 指向上一个节点
let cur = root;
let maxCount = 1; // 最大出现次数
let count = 1; // 出现次数
while (stack.length > 0 || cur) {
if (cur) {
stack.push(cur);
cur = cur.left; // 左
} else {
cur = stack.pop();
// 中
count = pre && cur.val === pre.val ? count + 1 : 1;
if (count === maxCount) {
res.push(cur.val);
} else if (count > maxCount) {
maxCount = count;
res = [cur.val];
}
pre = cur;
cur = cur.right; // 右
}
}
return res;
};
分析:时间复杂度为 O(n),空间复杂度为 O(logn)。
收获
利用二叉搜索树的特性,需要使用中序遍历。