当前位置: 首页 > article >正文

【代码随想录】刷题记录(61)-二叉搜索树中的众数

题目描述:

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

 

示例 1:

 

2d6ea5d5a756c203cd1ce763cf7b4603.jpeg

输入:root = [1,null,2,2]
输出:[2]

示例 2:

输入:root = [0]
输出:[0]

 

提示:

  • 树中节点的数目在范围 [1, 104] 内
  • -105 <= Node.val <= 105

 

我的作答:

二叉树也逐渐模版化了,整体思路和【代码随想录】刷题记录(60)-二叉搜索树的最小绝对差 一样,其实根据二叉树的特性,众数只会出现在相邻的元素中,一旦发现这一个结点和下一个结点的值不同,这个结点的值就不会再出现了;

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def __init__(self):
        self.pre = None
        self.count = 0
        self.countMax = 0
        self.res = []

    def findMode(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: List[int]
        """
        if not root:
            return None
        self.findMode(root.left) #左
        if not self.pre: #中
            self.count = 1
        elif self.pre.val==root.val:
            self.count += 1
        else:
            self.count = 1
        self.pre = root
        if self.count==self.countMax:
            self.res.append(root.val) #相同次数的众数
        elif self.count>self.countMax:
            self.res = [] #清空原数组
            self.countMax = self.count
            self.res.append(root.val)
        self.findMode(root.right) #右
        return self.res

cae2d3ec7c8b4eae9fe0b6a77e8620fb.png

 

参考代码:迭代法(看了很多次,没动手写过一次。。)

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def findMode(self, root):
        st = []
        cur = root
        pre = None
        maxCount = 0  # 最大频率
        count = 0  # 统计频率
        result = []

        while cur is not None or st:
            if cur is not None:  # 指针来访问节点,访问到最底层
                st.append(cur)  # 将访问的节点放进栈
                cur = cur.left  # 左
            else:
                cur = st.pop()
                if pre is None:  # 第一个节点
                    count = 1
                elif pre.val == cur.val:  # 与前一个节点数值相同
                    count += 1
                else:  # 与前一个节点数值不同
                    count = 1

                if count == maxCount:  # 如果和最大值相同,放进result中
                    result.append(cur.val)

                if count > maxCount:  # 如果计数大于最大值频率
                    maxCount = count  # 更新最大频率
                    result = [cur.val]  # 很关键的一步,不要忘记清空result,之前result里的元素都失效了

                pre = cur
                cur = cur.right  # 右

        return result

4b515146dbd649aea8413cc3664dd9bb.png

 


http://www.kler.cn/a/448646.html

相关文章:

  • Java重要面试名词整理(一):性能调优
  • [计算机网络]唐僧的”通关文牒“NAT地址转换
  • Elasticsearch:什么是提示工程 - prompt engineering?
  • TDesign:NavBar 导航栏
  • Tomcat部署war包项目解决404问题
  • LabVIEW深海气密采水器测控系统
  • 【Java入门指南 Day12:Java集合框架】
  • PostgreSQL和Postgis安装
  • 正反向代理 Nginx简单使用
  • 麒麟操作系统服务架构保姆级教程(三)ssh远程连接
  • 【从零开始的LeetCode-算法】3285. 找到稳定山的下标
  • LeetCode:1387. 将整数按权重排序(记忆化搜索 Java)
  • 【漏洞复现】CVE-2023-29944 Expression Injection
  • React:闭包陷阱产生和解决
  • 前端面经每日一题Day18
  • 八字精批API接口PHP实现返回json数据
  • GESP CCF C++一级编程等级考试认证真题 2024年12月
  • 银行转账虚拟生成器app银行转账模拟器银行模拟器 手机银行模拟器
  • 【Redis经典面试题六】Redis的持久化机制是怎样的?
  • Anaconda使用手册
  • yolov5 yolov6 yolov7 yolov8 yolov9目标检测、目标分类 目标切割 性能对比
  • 简单介绍一下Linux的常用命令
  • 【docker】列出与特定镜像名相关的镜像
  • 【漫话机器学习系列】017.大O算法(Big-O Notation)
  • 禅说:zookeeper与聚落。
  • MySQL 基础:开启数据库之旅