501. 二叉搜索树中的众数

2020-09-04
501. 二叉搜索树中的众数
题解:
思路1:递归
 
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var findMode = function (root) {
  // val 当前计算出现次数的值
  // times 当前计算值出现的次数
  // maxTimes 出现过最多的次数
  if (!root) return [];
  let ans = [], val = null, times = 1, maxTimes = -1;
  let fn = (node) => {
    if (!node) return; // 二叉树的前序遍历 从小到大遍历二叉树
    fn(node.left);
    if (val === null) val = node.val; // 遍历到最小值时 val是null 先赋值
    else { // val有值后说明已经不是最小值了 要进行是否相等的比较
      if (val === node.val) times++; // 如果相等 出现次数+1
      else if (times > maxTimes) { // 如果当前比较的val与当前节点的值不同 且val出现次数已经大于原先的最大次数
        maxTimes = times; // maxTimes重新赋值
        ans = [val]; // ans 清空后放入val
        val = node.val; // val重新赋值当前节点值 进入下一个数值的计数
        times = 1; // val出现次数变为1
      } else if (times === maxTimes) { // 如果当前的val与当前节点的值不同 且val出现次数等于原先的最大次数
        ans.push(val); // 说明出现了相同次数的值 push 入ans中
        val = node.val; // val重新赋值当前节点进入下一次计数
        times = 1; // val出现次数重新赋值为1
      } else { // 如果当前val值与当前节点值不同 且val次数小于原来的最大次数 可以不做处理
        times = 1;
        val = node.val; // val重新赋值当前节点进入下一次计数
      } 
    }
    fn(node.right);
  }
  fn(root);
  if (times > maxTimes) ans = [val]; // 遍历结束后 最后一次的val有可能会漏掉 要特殊处理
  else if (times === maxTimes) ans.push(val);
  return ans;
};
原文地址:https://www.cnblogs.com/lanpang9661/p/13613377.html