来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值 结点右子树中所含节点的值 大于等于 当前节点的值 左子树和右子树都是二叉搜索树
解答
直接遍历并记录所有出现次数,然后取出最多的,这个性能较差
/*** 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 max = 0;function traverse (node, record) {if (!node) return null;traverse(node.left, record);record[node.val] = (record[node.val] || 0) + 1;if (record[node.val] > max) {max = record[node.val];}traverse(node.right, record);return record;}let record = traverse(root, {});let result = [];for (let key of Object.keys(record)) {if (record[key] === max) {result.push(key);}}return result;};
优化
因为是二叉搜索树中查找出现次数最多的,所以不可能出现一个数值被超过了后面又超回来的情况,所以只需记录最多数量和值即可
/*** 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 result = [],maxCount = 0,currentCount = 0,currentVal = 0;function traverse (node) {if (!node) return null;traverse(node.left);if (node.val === currentVal) {++currentCount;} else {currentCount = 1;currentVal = node.val;}if (currentCount === maxCount) {result.push(currentVal);}if (currentCount > maxCount) {maxCount = currentCount;result = [ currentVal ];}traverse(node.right);}traverse(root);return result;};
