来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

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

假定 BST 满足如下定义:

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

解答

直接遍历并记录所有出现次数,然后取出最多的,这个性能较差

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val, left, right) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.left = (left===undefined ? null : left)
  6. * this.right = (right===undefined ? null : right)
  7. * }
  8. */
  9. /**
  10. * @param {TreeNode} root
  11. * @return {number[]}
  12. */
  13. var findMode = function(root) {
  14. let max = 0;
  15. function traverse (node, record) {
  16. if (!node) return null;
  17. traverse(node.left, record);
  18. record[node.val] = (record[node.val] || 0) + 1;
  19. if (record[node.val] > max) {
  20. max = record[node.val];
  21. }
  22. traverse(node.right, record);
  23. return record;
  24. }
  25. let record = traverse(root, {});
  26. let result = [];
  27. for (let key of Object.keys(record)) {
  28. if (record[key] === max) {
  29. result.push(key);
  30. }
  31. }
  32. return result;
  33. };

优化

因为是二叉搜索树中查找出现次数最多的,所以不可能出现一个数值被超过了后面又超回来的情况,所以只需记录最多数量和值即可

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val, left, right) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.left = (left===undefined ? null : left)
  6. * this.right = (right===undefined ? null : right)
  7. * }
  8. */
  9. /**
  10. * @param {TreeNode} root
  11. * @return {number[]}
  12. */
  13. var findMode = function(root) {
  14. let result = [],
  15. maxCount = 0,
  16. currentCount = 0,
  17. currentVal = 0;
  18. function traverse (node) {
  19. if (!node) return null;
  20. traverse(node.left);
  21. if (node.val === currentVal) {
  22. ++currentCount;
  23. } else {
  24. currentCount = 1;
  25. currentVal = node.val;
  26. }
  27. if (currentCount === maxCount) {
  28. result.push(currentVal);
  29. }
  30. if (currentCount > maxCount) {
  31. maxCount = currentCount;
  32. result = [ currentVal ];
  33. }
  34. traverse(node.right);
  35. }
  36. traverse(root);
  37. return result;
  38. };