二叉树——501.二叉搜索树中的众数、 236. 二叉树的最近公共祖先

二叉搜索树中的众数

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

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

假定 BST 满足如下定义:

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

示例 1:
在这里插入图片描述

输入:root = [1,null,2,2]
输出:[2]
1. 在主函数中求众数,也就是在有序序列中求众数。
2. 因为可能存在多个众数,我们用 cnt 记录当前元素重复的次数,
用 maxCnt 记录已经遍历过的元素当中出现最多的元素的出现次数,用 res 记录众数。
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        lst = []
        self.In0rder(root, lst)
        # 记录前一个元素值
        pre = lst[0]    
        # 记录次数
        cnt = 1
        # 记录最大次数
        maxCnt = 1
        # 记录结果
        res = [lst[0]]

        for i in range(1, len(lst)):
            # 如果与前一个节点的值相等
            if pre == lst[i]:
                cnt += 1
            else:
                cnt = 1
            # 如果和最大次数相同,将值放入res
            if cnt == maxCnt:
                res.append(lst[i])
            # 如果大于最大次数
            if cnt > maxCnt:
                # 更新最大次数
                maxCnt = cnt
                # 重新更新res
                res = [lst[i]]
            pre = lst[i]
        
        return res 
二叉树最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
在这里插入图片描述

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode' ) -> 'TreeNode':

        # 1、如果此时访问的节点 root 为 null,那么直接返回 null
        if not root:  
           return None

        # 2、如果此时访问的节点 root 为指定节点 p,那么返回 p 这个节点
        if root == p : return p

        # 3、如果此时访问的节点 root 为指定节点 q,那么返回 q 这个节点
        if root == q : return q
        
        # 4、经过上面 1、2、3 的判断之后,root 这个节点必然不是 p、q、null 这三种情况的节点
        # 接下来,去递归的判断当前节点 root 的左右子树是否包含 p 、q 这两个指定节点


        # 5、递归的去查找 root 的左子树,判断是否包含p 、q 这两个指定节点
        # 如果 root 的左子树节点和它的左子树所有节点中包含 p,那么 left 的值就是 p
        # 如果 root 的左子树节点和它的左子树所有节点中包含 q,那么 left 的值就是 q
        # 如果 root 的左子树节点和它的左子树所有节点中既不包含 p,也不包含 q,那么 left 的值就是 null
        left = self.lowestCommonAncestor(root.left,p,q)


        # 6、递归的去查找 root 的右子树,判断是否包含p 、q 这两个指定节点
        # 如果 root 的右子树节点和它的右子树所有节点中包含 p,那么 right 的值就是 p
        # 如果 root 的右子树节点和它的右子树所有节点中包含 q,那么 right 的值就是 q
        # 如果 root 的右子树节点和它的右子树所有节点中既不包含 p,也不包含 q,那么 right 的值就是 null
        right = self.lowestCommonAncestor(root.right,p,q)


        # 7、判断完当前节点 root 、 root 的左子树 left、root 的右子树 right 的情况后
        # 开始向父节点传递信息

        # 8、如果 root 节点的左子树 left 和右子树 right 都没有找到指定节点 p、q
        # 并且 root 自己本身也不是指定节点 p、q
        # 那么它给父节点传递的信息就是以 root 为根节点的那颗二叉树没有指定节点 p、q 
        if not left and not right :

            # 返回 null,告诉 root 的父节点,这里没找到指定节点 p、q
            return None

        # 9、如果在 root 节点的左子树 left 中没有找到指定节点 p、q 
        # 那么以 root 为根节点的那颗二叉树能不能找到指定节点 p、q  完全取决于 right 了
        elif not left :

            # 返回 right ,告诉 root 的父节点,能不能找到指定节点 p、q  完全取决于 right 
            return right

        # 10、如果在 root 节点的右子树 right 中没有找到指定节点 p、q 
        # 那么以 root 为根节点的那颗二叉树能不能找到指定节点 p、q  完全取决于 left 了
        elif not right :

            # 返回 left ,告诉 root 的父节点,能不能找到指定节点 p、q  完全取决于 left 
            return left

        # 11、此时,left != null 并且 right != null
        # 这说明在以 root 节点为根节点的那棵二叉树中找到了指定节点 p ,也找到了指定节点 q 
        # 那么就告诉父节点,root 就是 p、q 的最近公共祖先
        else:
            
            # 返回 root ,告诉 root 的父节点,root 就是 p、q 的最近公共祖先
            return root

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/448539.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络、网络协议模型、UDP编程——计算机网络——day01

今天来到了网络编程,主要讲了网络、网络协议模型以及UDP编程 网络 网络主要是进行:数据传输和数据共享 网络协议模型 OSI协议模型应用层 实际发送的数据表示层 发送的数据是否加密会话层 是否建立会话连接传…

2024暑期实习八股笔记

文章目录 自我介绍MySQL索引索引种类、B树聚簇索引、非聚簇索引联合索引、最左前缀匹配原则索引下推索引失效索引优化 日志、缓冲池redo log(重做日志)刷盘时机日志文件组 bin log(归档日志)记录格式写入机制 两阶段提交undo log&…

洛谷 素数环 Prime Ring Problem

题目描述 PDF 输入格式 输出格式 题意翻译 输入正整数 nn,把整数 1,2,\dots ,n1,2,…,n 组成一个环,使得相邻两个整数之和均为素数。输出时,从整数 11 开始逆时针排列。同一个环恰好输出一次。n\leq 16n≤16,保证一定有解。 多…

某宝某猫商品详情页面数据逆向

​​​​​逆向网址 aHR0cHM6Ly93d3cudGFvYmFvLmNvbS8 aHR0cHM6Ly93d3cudG1hbGwuY29tLw 逆向链接 aHR0cHM6Ly9kZXRhaWwudG1hbGwuY29tL2l0ZW0uaHRtP2lkPTc0NDk3NDQ4NTI3NSZwdmlkPTFiMzdmNjUyLTRjNDYtNGM2Ni04MDg4LWRhYmJiZDJhMzJhNSZzY209MTAwNy40MDk4Ni4yNzY3NTAuMCZzcG09YTIxY…

12、MongoDB -- 通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库(传统的同步API编程)

目录 通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库(传统的同步API编程)演示前提:登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 代码演示同步API编…

基于SpringBoot和PotsGIS的各省地震震发可视化分析

目录 前言 一、后台接口研发 1、控制层实现 2、Mapper访问层 3、空间查询分析 二、前端可视化展示 1、主体地图定义 2、行政区划列表定义 3、行政区划定位 三、数据分析 1、北京市 2、广东省 3、青海省 4、湖南省 总结 前言 在之前的博文中,我们…

【Python】一文详细介绍 plt.rcParamsDefault 在 Matplotlib 中的原理、作用、注意事项

【Python】一文详细介绍 plt.rcParamsDefault 在 Matplotlib 中的原理、作用、注意事项 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

每日OJ题_牛客OR57 手套

目录 牛客OR57 手套 解析代码 牛客OR57 手套 手套_牛客题霸_牛客网 class Gloves { public:int findMinimum(int n, vector<int> left, vector<int> right) {} }; 解析代码 class Gloves { public:int findMinimum(int n, vector<int> left, vector<i…

机器学习——Q-Learning

Outline Critic 从头往后&#xff0c;逐渐累积 新时刻跟前一时刻有关 不同的方法得到不同的假设&#xff0c;得到不同的结果 Q-function 在状态s下强制执行a得到对应的奖励 目标网络 targe一直在变 将其中的一个Q进行固定 sample a batch udpdate Q-function …

2023年中国高校大数据挑战赛D题参考论文发布(全网首发)

腾讯文档】2023年大数据挑战赛资料说明 https://docs.qq.com/doc/DSEpWUVFySm1ObFB0 基于数据分析的行业职业技术培训能力评价 摘要 中国是制造业大国&#xff0c;产业门类齐全&#xff0c;每年需要培养大量的技能娴熟的技术工人进入工厂。本文将基于题目给出的数据&#x…

输出int型最大值、最小值的小妙招

如果在算法竞赛中要求输入数据是一个范围很大的数&#xff0c;而你又忘了int型的数据范围&#xff0c;这时该怎么办呢&#xff1f; 比如洛谷P1001号题目&#xff1a; 【题目描述】 输入两个整数a,b&#xff0c;输出它们的和&#xff08;∣a∣,∣b∣≤&#xff09;。 【输入…

微信小程序开发系列(二十)·wxml语法·setData()修改对象类型数据、ES6 提供的展开运算符、delete和rest的用法

目录 1. 新增单个、多个属性 1.1 新增单个属性 1.2 新增多个属性 2. 修改单个、多个属性 2.1 修改单个属性 2.2 修改多个属性 3. 优化 3.1 ES6 提供的展开运算符 3.2 Object.assign()将多个对象合并为一个对象 4. 删除单个、多个属性 4.1 删除单个属性 …

leetcode 热题 100_旋转图像

题解一&#xff1a; 翻转数组&#xff1a;先将数组沿右上-左下对角线翻转&#xff0c;再将数组上下翻转。 class Solution {public void rotate(int[][] matrix) {int n matrix.length;for (int i 0; i < n; i) {//沿右上-左下对角线翻转for (int j 0; j < n - i - 1…

Corel会声会影视频编辑软件英文名是Corel VideoStudio2023

Corel会声会影视频编辑软件英文名是Corel VideoStudio2023&#xff0c;可以抓取、编制和导出多种常见的视频格式。介绍整理从早期的会声会影9、会声会影10后到会声会影X系列版本包括X2、X3、X4、X5、X6、X7、X8、X9、X10&#xff0c;2018&#xff0c;2019&#xff0c;2020&…

分布式之Ribbon使用以及原理

Ribbon使用以及原理 1、负载均衡的两种方式 服务器端负载均衡 传统的方式前端发送请求会到我们的的nginx上去&#xff0c;nginx作为反向代理&#xff0c;然后路由给后端的服务器&#xff0c;由于负载均衡算法是nginx提供的&#xff0c;而nginx是部署到服务器端的&#xff0c;所…

动态代理以及Retrofit的原理

代理模式&#xff09; 首先什么是代理模式&#xff1f; 代理模式就是通过引入代理对象去帮助真实对象完成一些事情&#xff0c;防止直接访问目标对象给系统带来不必要的复杂性。 代理模式一般分为三个角色&#xff1a; 抽象角色&#xff1a; 指代理对象和真实对象对外提供的…

YOLOv8_pose-Openvino和ONNXRuntime推理【CPU】

1 环境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包&#xff0c;主要用于对深度推理做优化。 Openvino内部集成了Opencv、Tens…

数据结构--链表和递归

前面我们所学习的线性数据结构 1、动态数组 2、栈 3、队列 它们的底层都是依托于静态的数组所实现&#xff1a;靠resize解决固定容量的问题 一、链表 1、链表&#xff1a;真正的动态数据结构 优点&#xff1a;不需要处理固定容量的问题&#xff0c;是真正的动态数据结构 …

【leetcode C++】最小栈

leetcode 155. 最小栈 题目 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获…

2024.3.11

作业&#xff1a; #include <iostream> #include<iomanip> #include<string> using namespace std;int main() {string str; // array<char,128> a; // array<char,128>::iterator iter;cout << "请输入一个字符串:" <…