找出二叉查找树中出现频率最高的元素。树中结点满足left->val <= root->val <= right->val。如果多个元素出现次数相等,返回最小的元素。
在一个有序数组中,我们查找出现频率最高的元素,很简单,顺序扫描一遍即可统计出。那么我们对二叉查找树也可以用类似方式统计,因为中序遍历序列就是有序序列,所以我们在中序遍历的过程中就可以统计出出现频率最高的元素。
int GetMostFrequently(TreeNode *root) { if(root == NULL) throw new invalid_argument("Can't be a NULL tree"); int mostFrequently = INT_MAX; int current = INT_MAX; int currentFrequency = 0; int maxFrequency = 0; _GetMostFrequently(root, current, currentFrequency, maxFrequency, mostFrequently); return mostFrequently; } void _GetMostFrequently(TreeNode *root, int ¤t, int & currentFrequency, int &maxFrequency, int &mostFrequently) { if(root == NULL) return; _GetMostFrequently(root->left, current, currentFrequency, maxFrequency, mostFrequently); if(root->val == current) { ++currentFrequency; } else { current = root->val; currentFrequency = 1; } if(currentFrequency > maxFrequency) { maxFrequency = currentFrequency; mostFrequently = current; } _GetMostFrequently(root->right, current, currentFrequency, maxFrequency, mostFrequently); }
Java版本代码:
private static class Stat { int freq, val; boolean inited; } public int mostFrequent(TreeNode root) throws Exception { if(root == null) throw new Exception("null root!"); Stat result = new Stat(), current = new Stat(); mostFrequent(root, result, current); return result.val; } private void mostFrequent(TreeNode node, Stat result, Stat current) { if(node == null) return; mostFrequent(node.left, result, current); if(!current.inited || node.val != current.val) { current.inited = true; current.freq = 1; current.val = node.val; } else { current.freq++; } if(current.freq > result.freq) { result.freq = current.freq; result.val = current.val; } else if(current.freq == result.freq && current.val < result.val) { result.val = current.val; } mostFrequent(node.right, result, current); }
相关推荐
VUE 面试题汇合 vue-interview-questions-master VUE 面试题汇合 vue-interview-questions-master VUE 面试题汇合 vue-interview-questions-master VUE 面试题汇合 vue-interview-questions-master VUE 面试题...
类似题目1.二叉搜索树解法:因为二叉搜索树 左孩子>父节点>右孩子,因此可以从跟遍历如果传入的两个节点都小于当前比较的节点,那么这两个节点的公共节点在当前比较节
通过学习和复习这些知识点,并结合"Java-Interview-超全集合github上评分最高的jiva面试题"中的题目进行实战演练,可以有效地提升Java开发者在面试中的竞争力,为成功获得理想职位打下坚实基础。在面试准备过程中,...
【标题】"interview-docs-master.zip" 是一个压缩文件,通常包含一系列关于面试准备的文档,特别是针对Java程序员的面试资源。这个压缩包可能是为了帮助求职者在寻找Java开发职位时,熟悉并掌握常见的面试问题和解答...
在IT行业中,尤其是在软件开发和数据科学领域,面试过程中算法和数据结构的考察是不可或缺的部分。"Algorithm_for_Interview-Chinese-master.zip" 这个压缩包文件很可能包含了丰富的面试准备资料,聚焦于C++语言,...
本压缩包中的"coding-interview-university-master"目录,很可能是包含了一个逐步学习算法和数据结构的课程结构,这对于准备技术面试,尤其是硅谷流行的“编程面试”极其有价值。 学习算法,首先要理解基础的数据...
123-Essential-JavaScript-Interview-Question, JavaScript访问问题 123 -JavaScript-Interview-Questions这本书将由 2018年06月 完成并可以供购买。 如果你想让我把这本书的早期拷贝,请在这里添加你的NAME 和电子...
3. **数据结构与算法**:涉及排序算法(如冒泡、插入、选择、快速、归并排序等)、查找算法(如线性搜索、二分搜索等)、栈和队列的实现、哈希表、树结构(如二叉树、AVL树、红黑树等)。 4. **面向对象编程**:类...
这份名为"Interview-Materials.rar__interview_interview-q"的压缩包文件显然是为准备IT行业面试者精心准备的一份资源集合。它涵盖了C、C++以及Linux等多个关键领域的知识,帮助求职者一站式获取必要的面试准备材料...
Technical-Interview-Preparation-Checklist.pdf
可能包含链表、树、图、堆、栈、队列等经典数据结构的实现,以及排序(快速排序、归并排序、冒泡排序等)、查找(二分查找、哈希查找)等算法。通过源码,我们可以学习到如何高效地处理数据和解决问题。 2. 编程...
DOCKER-INTERVIEW-QUESTIONS.pdf
- 给定一个非负整数数组,找出数组中出现次数前k多的元素。这是排序和哈希表组合的问题,可以用最小堆优化。 48. MeetingRoomsII - 给定一个会议时间安排的数组,确定需要多少个会议室。这是考察时间区间和最小堆...
vim 查找相同的两行思路:先将两行排序,然后查找前一行等于后一行的内容^\(.\+\)$\n表示一整行的模式,\1表示第一个组vim删除相同的行给出vim w
7. **Pattern Top _K_ Elements**:找出数组中最大的K个元素,这可以使用优先队列(堆)或者快速选择算法来实现,高效地返回前K个最大值。 8. **Pattern Sliding Window**:滑动窗口是处理数组或字符串问题的一个...
java面试题_java-interview-questions-master.zip2、在 Java 程序中怎么保证多线程的运行安全? 出现线程安全问题的原因一般都是三个原因: 1、 线程切换带来的原子性问题 解决办法:使用多线程之间同步...
115-Java-Interview-Questions-and-Answers, 115 Java访谈问题和答案- 终极列表 #115-Java-Interview-Questions-and-Answers我们将讨论关于Java面试中可以使用的各种问题,以便雇主在Java和面向对象编程方面测试你的...
深度学习框架001 深度学习框架有哪些?002 介绍一下TensorFlow常用的Optimizer003 Caffe的depthwise为什么慢,怎么解决00
Leetcode 面试题 54 二叉搜索树的第k大节点题目描述给定一棵二叉搜索树,请找出其中第k大的节点。示例1:/ \1 4输出: 4示例2:/ \3 6/
MySQL索引原理查找算法:二叉查找树BitMap位图索引分类主键索引唯一索引普通索引全文索引索引原理解析B+树聚集索引和非聚集索引建立索引创建表时指定组合索引