二叉搜索树中的众数
时间:2022-07-25
本文章向大家介绍二叉搜索树中的众数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
二叉搜索树中的众数
给定一个有相同值的二叉搜索树BST
,找出BST
中的所有众数(出现频率最高的元素)。
假定BST
有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值。
- 结点右子树中所含结点的值大于等于当前结点的值。
- 左子树和右子树都是二叉搜索树。
示例
给定BST [1,null,2,2]
,返回[2]
。
1
2
/
2
注意
提示:如果众数超过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) {
if(!root) return [];
var cur = Infinity;
var curCounter = 0;
var maxValues = [];
var maxValuesCounter = -Infinity;
var dfs = (root) => {
if(!root) return void 0;
if(root.left) dfs(root.left);
if(cur === root.val){
++curCounter;
}else{
cur = root.val;
curCounter = 0;
}
if(curCounter >= maxValuesCounter){
if(curCounter === maxValuesCounter) maxValues.push(root.val);
else maxValues = [root.val];
maxValuesCounter = curCounter;
}
if(root.right) dfs(root.right);
}
dfs(root);
return maxValues;
};
思路
本题的题目中有一个进阶条件:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内),如果不考虑这个进阶条件的话,直接遍历一遍二叉树并且顶一个哈希表将遍历过的值以及出现的次数记录,之后再遍历一遍哈希表取出众数即可,考虑到这个进阶条件,那么就需要定义一些变量保存当前的状态,判断哪些条件符合要求,置入返回值,当对二叉搜索树进行二叉树中序遍历时,能够得到一个有序的序列,通过数列有序以及存储当前状态的变量即可达到目标,此外还需要注意的是题目要求是返回一个数组,也就说众数可能有多个。首先判断如果是空树直接返回空数组,定义当前值为Infinity
无穷大,定义当前值计数器为0
,最大值数组为空数组,最大值计数器为-Infinity
负无穷大,之后定义深度递归遍历,首先判断节点不存在则直接返回,若左节点存在则向左递归,之后定义的处理位置即中序遍历,如果当前结点值与存储的遍历当前节点值相同则将计数器递增,否则将当前值置数为节点值,将计数器置0
,如果当前计数器大于等于最大值的计数器则进入条件,如果这两个值相等,那么将该值置入最大值数组,否则将最大值数组置换为只有该值的数组,然后将最大值计数器赋值当前值计数器,之后判断右节点存在则向右递归,最终返回最大值数组即可。
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://leetcode-cn.com/problems/find-mode-in-binary-search-tree
- 代码+实战:TensorFlow Estimator of Deep CTR —— DeepFM/NFM/AFM/FNN/PNN
- 【SSH测试整合Demo】企业人事管理系统
- Hybris 项目工程配置
- 购物车案例【简单版】
- 再学习之MyBatis.
- 用户登陆注册【JDBC版】
- 学习思考之《编程之美》.
- 干货 | 深度剖析服务发现组件Netflix Eureka
- 多线程编程学习一(Java多线程的基础).
- TensorFlow | 自己动手写深度学习模型之全连接神经网络
- 多线程编程学习二(对象及变量的并发访问).
- ASM基本配置问题(r5笔记第89天)
- 如何上手使用 Facebook 的开源平台 Detectron?
- 多线程编程学习三(线程间通信).
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python面试题汇总
- lldb 入坑指北(3) - 打印 c++ 实例的虚函数表
- 一文让你彻底搞懂`__str__`和`__repr__`?
- lldb 入坑指北(1) - 给Xcode批量添加启用&禁用断点功能
- Xcode 中的 Workspace、Project、Target 和 Scheme
- 学习Python一年,这次终于弄懂了浅拷贝和深拷贝
- 为速度而生的构建系统 - Ninja
- Python面试题:字符串连接
- Python面试突击
- 我半夜爬了严选的女性文胸数据,发现了惊天秘密
- 二分查找(Python实现)
- 图解JavaScript——代码实现【2】(重点是Promise、Async、发布/订阅原理实现)
- 编译器 bug 系列(1)
- 面试高频:反转链表
- 存储过程