`

Google Interview - 找出二叉查找树中出现频率最高的元素

 
阅读更多

找出二叉查找树中出现频率最高的元素。树中结点满足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 &current, 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-interview-questions-master.zip

    VUE 面试题汇合 vue-interview-questions-master VUE 面试题汇合 vue-interview-questions-master VUE 面试题汇合 vue-interview-questions-master VUE 面试题汇合 vue-interview-questions-master VUE 面试题...

    guanjunjian#Interview-Summary#68-树中两个节点的最低公共祖先1

    类似题目1.二叉搜索树解法:因为二叉搜索树 左孩子&gt;父节点&gt;右孩子,因此可以从跟遍历如果传入的两个节点都小于当前比较的节点,那么这两个节点的公共节点在当前比较节

    Java-Interview-超全集合github上评分最高的jiva面试题

    通过学习和复习这些知识点,并结合"Java-Interview-超全集合github上评分最高的jiva面试题"中的题目进行实战演练,可以有效地提升Java开发者在面试中的竞争力,为成功获得理想职位打下坚实基础。在面试准备过程中,...

    interview-docs-master.zip

    【标题】"interview-docs-master.zip" 是一个压缩文件,通常包含一系列关于面试准备的文档,特别是针对Java程序员的面试资源。这个压缩包可能是为了帮助求职者在寻找Java开发职位时,熟悉并掌握常见的面试问题和解答...

    Algorithm_for_Interview-Chinese-master.zip

    在IT行业中,尤其是在软件开发和数据科学领域,面试过程中算法和数据结构的考察是不可或缺的部分。"Algorithm_for_Interview-Chinese-master.zip" 这个压缩包文件很可能包含了丰富的面试准备资料,聚焦于C++语言,...

    Algorithm-coding-interview-university.zip

    本压缩包中的"coding-interview-university-master"目录,很可能是包含了一个逐步学习算法和数据结构的课程结构,这对于准备技术面试,尤其是硅谷流行的“编程面试”极其有价值。 学习算法,首先要理解基础的数据...

    123-Essential-JavaScript-Interview-Question, JavaScript访问问题.zip

    123-Essential-JavaScript-Interview-Question, JavaScript访问问题 123 -JavaScript-Interview-Questions这本书将由 2018年06月 完成并可以供购买。 如果你想让我把这本书的早期拷贝,请在这里添加你的NAME 和电子...

    Interview-code-practice-python-master_escapek5u_python_

    3. **数据结构与算法**:涉及排序算法(如冒泡、插入、选择、快速、归并排序等)、查找算法(如线性搜索、二分搜索等)、栈和队列的实现、哈希表、树结构(如二叉树、AVL树、红黑树等)。 4. **面向对象编程**:类...

    Interview-Materials.rar__interview_interview-q

    这份名为"Interview-Materials.rar__interview_interview-q"的压缩包文件显然是为准备IT行业面试者精心准备的一份资源集合。它涵盖了C、C++以及Linux等多个关键领域的知识,帮助求职者一站式获取必要的面试准备材料...

    Technical-Interview-Preparation-Checklist.pdf

    Technical-Interview-Preparation-Checklist.pdf

    Interview-main-源码.rar

    可能包含链表、树、图、堆、栈、队列等经典数据结构的实现,以及排序(快速排序、归并排序、冒泡排序等)、查找(二分查找、哈希查找)等算法。通过源码,我们可以学习到如何高效地处理数据和解决问题。 2. 编程...

    DOCKER-INTERVIEW-QUESTIONS.pdf

    DOCKER-INTERVIEW-QUESTIONS.pdf

    coding-interview-in-java.pdf

    - 给定一个非负整数数组,找出数组中出现次数前k多的元素。这是排序和哈希表组合的问题,可以用最小堆优化。 48. MeetingRoomsII - 给定一个会议时间安排的数组,确定需要多少个会议室。这是考察时间区间和最小堆...

    bitcarmanlee#easy-algorithm-interview-and-practice#vim 查找相同行 删除向

    vim 查找相同的两行思路:先将两行排序,然后查找前一行等于后一行的内容^\(.\+\)$\n表示一整行的模式,\1表示第一个组vim删除相同的行给出vim w

    Grokking the Coding Interview - Patterns for Coding Questions.zip

    7. **Pattern Top _K_ Elements**:找出数组中最大的K个元素,这可以使用优先队列(堆)或者快速选择算法来实现,高效地返回前K个最大值。 8. **Pattern Sliding Window**:滑动窗口是处理数组或字符串问题的一个...

    java面试题-java-interview-questions-master.zip

    java面试题_java-interview-questions-master.zip2、在 Java 程序中怎么保证多线程的运行安全? 出现线程安全问题的原因一般都是三个原因: 1、 线程切换带来的原子性问题 解决办法:使用多线程之间同步...

    115-Java-Interview-Questions-and-Answers, 115 Java访谈问题和答案- 终极列表.zip

    115-Java-Interview-Questions-and-Answers, 115 Java访谈问题和答案- 终极列表 #115-Java-Interview-Questions-and-Answers我们将讨论关于Java面试中可以使用的各种问题,以便雇主在Java和面向对象编程方面测试你的...

    amusi#Deep-Learning-Interview-Book#深度学习框架1

    深度学习框架001 深度学习框架有哪些?002 介绍一下TensorFlow常用的Optimizer003 Caffe的depthwise为什么慢,怎么解决00

    marsXyr#Leetcode_python#Interview_54_easy_二叉搜索树的第k大节点1

    Leetcode 面试题 54 二叉搜索树的第k大节点题目描述给定一棵二叉搜索树,请找出其中第k大的节点。示例1:/ \1 4输出: 4示例2:/ \3 6/

    CcoWzh#Interview-Of-Programmer#MySQL索引原理1

    MySQL索引原理查找算法:二叉查找树BitMap位图索引分类主键索引唯一索引普通索引全文索引索引原理解析B+树聚集索引和非聚集索引建立索引创建表时指定组合索引

Global site tag (gtag.js) - Google Analytics