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; };