代码训练营第二十天|530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

news2024/9/21 0:33:47

530 .二叉搜索树的最小绝对差

看完题后的思路

因为是二叉搜索树,所以直接按照二叉搜索树中序遍历,得到递增序列。遍历过程中一个指针指向遍历过的前一个元素
pre=null;

  1. void f(root)
  2. if root==null return
  3. 递归
    f(left)
    计算差值
    pre=root
    f(root)
    pre可以作为一个全局变量,在操作完元素后赋下一个值

代码

  TreeNode pre;
    int resgetMinimumDifference=Integer.MAX_VALUE;
    public int getMinimumDifference(TreeNode root) {
        getMinimumDifferenceDG(root);
        return resgetMinimumDifference;
    }
    public void getMinimumDifferenceDG(TreeNode root) {
        if (root==null){
            return;
        }
        getMinimumDifferenceDG(root.left);
        if (pre!=null){
            resgetMinimumDifference=Math.min(Math.abs(root.val-pre.val),resgetMinimumDifference);
        }
        pre=root;
        getMinimumDifferenceDG(root.right);
    }

复杂度

在这里插入图片描述
迭代算法略

收获

本题解决了二叉树中的双指针的写法

530.二叉搜索树的最小绝对差

看完题后的思路

使用中序遍历,if 当前元素!=pre || pre==null ,进行新一轮的计数,上一元素是否是众数,否则 次数值加一
res【】

  1. void f(root)
  2. if (root==null) return
  3. 中序+pre

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
 ArrayList<Integer> findModeRes = new ArrayList<Integer>();
    int count=0;
    int maxCount=-1;
  TreeNode pre;
    public int[] findMode(TreeNode root) {
     
        findModeDG(root);
        int[] res = new int[findModeRes.size()];
        int i=0;
        for (Integer integer : findModeRes) {
            res[i++]=integer;
        }
        return res;
    }
   public void findModeDG(TreeNode root) {
        if (root==null){
            return;
        }
        findModeDG(root.left);
        // 没有考虑单节点情况
        if (pre==null||pre.val!=root.val){
            count=1;
        }else{
            count++;
        }
        pre=root;
       
            if (count>maxCount){
                findModeRes.clear();// 清空 加新的众数
                findModeRes.add(root.val);
                maxCount=count;
               
            }else if (count==maxCount){
                findModeRes.add(root.val);
              
            }
        findModeDG(root.right);
    }
}

复杂度

本题使用一遍迭代就求出了众数,具体做法为

  1. 统计元素个数
  2. 根据元素个数做相应操作

在这里插入图片描述

收获

1. 三刷写一遍
2. 求数组众数的最优写法

二叉树的最近公共祖先

在这里插入图片描述

看完题后的思路

从下往上走,使用后续遍历

  1. node f(root)
  2. 递归终止条件
    if root==null
    return null;
  3. 递归逻辑
    if(root.val=其中一个){
    return root;
    }
    left=f(左)
    right=f(右)
    if(左右全为空){
    return null}
    if (左右只有一个为空){
    return 不为空的那个;
    }
    return 左右的公共节点,就是我
    在这里插入图片描述

思路

本题既有从上到下,又有从下到上。前序负责从上到下,后续负责从下到上前序是,分别判断每一个节点是不是与目标节点相同,如果相同,终止递归
在这里插入图片描述
在这里插入图片描述
后续时,判断从下到上的返回值,如果两个返回值,则说明我是公共节点,一个返回值,该返回值是公共节点,如果没有返回值,则公共节点为空。

代码

        }
   //236. 二叉树的最近公共祖先
   public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root==null){
            return null;
        }
        // 先前序
        if (root==p||root==q){
            return root;
        }
       TreeNode left = lowestCommonAncestor(root.left, p, q);
       TreeNode right = lowestCommonAncestor(root.right, p, q);
       if (left==null&&right==null){
           return null;
       }
       // 有一个空
       if (left==null||right==null){
           return left!=null ? left : right;
       }
       //如果左右都不为空,返回自己
       return root;

   }

复杂度

在这里插入图片描述

收获

三刷要再刷一遍
本题的前序负责从上到下,后续负责从下到上很有知道意义

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git语义化定制版本规范

目录说明说明 语义化版本控制规范,语义化的版本控制规范要求版本号由三部分构成&#xff1a;x.y.z MAJOR&#xff08;X&#xff09;&#xff1a;这个是主版本号&#xff0c;一般是涉及到不兼容的 API 更改时&#xff0c;这个会变化。MINOR&#xff08;Y&#xff09;&#xff…

剑指Offer pow() 函数实现(快速幂)!!!

剑指 Offer 16. 数值的整数次方 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000 示…

早已有所耳闻的堆排序,你知道如何用C语言实现吗? 【堆排序|C语言版】

目录 0.写在前面 1.什么是堆&#xff1f; 2. 堆排序 2.1 建堆 2.1.1 AdjustUp&#xff08;向上调整算法&#xff09; 2.1.2 AdjustDown&#xff08;向下调整算法&#xff09; 2.2 两种建堆算法的时间复杂度 2.2.1 AdjustUp建堆的时间复杂度 2.2.2 AdjustDown建堆的时间…

神经网络(模型)量化介绍 - PTQ 和 QAT

神经网络&#xff08;模型&#xff09;量化介绍 - PTQ 和 QAT1. 需求目的2. 量化简介3. 三种量化模式3.1 Dynamic Quantization - 动态量化3.2 Post-Training Static Quantization - 训练后静态量化3.3 Quantization Aware Training - 量化感知训练4. PTQ 和 QAT 简介5. 设备和…

Flutter 小技巧之 3.7 性能优化background isolate

Flutter 3.7 的 background isolate 绝对是一大惊喜&#xff0c;尽管它在 release note 里被一笔带过 &#xff0c;但是某种程度上它可以说是 3.7 里最实用的存在&#xff1a;因为使用简单&#xff0c;提升又直观。 Background isolate YYDS 前言 我们知道 Dart 里可以通过新建…

CODESYS开发教程9-文件读写(CAA File库)

今天继续我们的小白教程&#xff0c;老鸟就不要在这浪费时间了&#x1f60a;。 前面一期我们介绍了CODESYS的定时器及触发相关的功能块。这一期主要介绍CODESYS的CAA.File库中的目录和文件读写功能块&#xff0c;主要包括文件路径、名称、大小的获取以及文件的创建、打开、读、…

软测(概念) · 软件测试的基本概念 · 什么是需求 · 测试用例的概念 · 软件错误(bug)的概念

一、什么是软件测试软件测试和开发的区别测试和调试的区别一个优秀的软件测试人员具备的素质二、什么是需求从测试人员角度看待需求三、测试用例的概念四、软件错误&#xff08;bug&#xff09;的概念一、什么是软件测试 最常见的解释是&#xff1a;软件测试就是找 BUG&#x…

个人博客美化

总体参考&#xff1a; Butterfly 文档&#xff1a;https://butterfly.js.organzhiyu &#xff1a;https://anzhiy.cn张洪 Heo &#xff1a;https://blog.zhheo.comLeonus &#xff1a;https://blog.leonus.cn 注&#xff1a;博客所有美化大部分&#xff08;全部&#xff09;都参…

React项目实战之租房app项目(九)登录模块基础布局和功能实现

前言 目录前言一、房屋详情模块二、登录模块2.1 登录模块效果图2.2 基础布局2.3 调用接口实现登录2.4 实现表单验证功能2.4.1 formik介绍2.4.2 formik基本使用2.4.3 添加表单验证2.5 代码优化总结一、房屋详情模块 房屋详情模块主要是展示之前获取到的房源信息&#xff0c;由于…

为防护加码,飞凌嵌入式i.MX93系列开发板让通信安全又稳定

来源&#xff1a;飞凌嵌入式官网www.forlinx.com随着新基建的加快推进&#xff0c;智能制造迎来了更好的发展时机&#xff0c;嵌入式板卡等智能设备也在更多的应用场景中大放异彩。但随着现场的设备数量的剧增&#xff0c;环境中的各种干扰信号也随之增加&#xff0c;这就对设备…

windows下GitHub的SSH key配置

SSH Key 是一种方法来确定受信任的计算机&#xff0c;从而实现免密码登录。 Git是分布式的代码管理工具&#xff0c;远程的代码管理是基于SSH的&#xff0c;所以要使用远程的Git则需要SSH的配置。 下面的步骤将完成 生成SSH密钥 并 添加公共密钥到GitHub上的帐户 先设置GitHub…

Apifox接口测试工具详细解析

最近发现一款接口测试工具--apifox&#xff0c;我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式&#xff0c;更能说明apifox可以做什么。 Apifox Postman Swagger Mock JMeter Apifox的特点&#xff1a; 接口文档定义&#xff1a; Apif…

接口测试学习第二天

1、全局变量 概念&#xff1a;在postman全局生效的变量&#xff0c;全局唯一。设置&#xff1a; 代码设置&#xff1a;pm.globals.set("glb_age",100)//示例&#xff1a; pm.globals.set("glb_age",100) 获取&#xff1a; 代码获取&#xff1a;var 接收值…

Java的内部类详解(成员内部类、静态内部类、局部内部类、匿名内部类)

Java知识点总结&#xff1a;想看的可以从这里进入 目录2.2.4、 内部类1、成员内部类2、静态内部类3、局部内部类4、匿名内部类2.2.4、 内部类 一个类定义在另一个类内&#xff0c;那么这个类就是一个内部类&#xff0c;比如&#xff1a;在类A中定义一个类B&#xff0c;B就是内…

英特尔锐炫秒杀RTX 3060,XeSS现已支持超过35款游戏!

一款显卡的性能可以达到什么程度&#xff1f;除了架构、规格等硬件因素&#xff0c;驱动的优化程度同样至关重要。Intel携带Arc锐炫回归独立显卡市场&#xff0c;作为“后起之秀”&#xff0c;驱动的优劣更是关键中的关键。Intel也正是这么做的。2022年6月&#xff0c;Intel正式…

2023 NFT防骗指南:六大骗局,3招带你远离…

网上流传着一句&#xff1a;币圈一天&#xff0c;人间一年。在刚刚过去的农历新年&#xff0c;一直低迷的加密领域迎来了“短暂性复苏”&#xff0c;加密市场总市值重回万亿美元。 同时复苏的还有NFT市场&#xff0c;据欧科云链OKLink链上数据显示&#xff0c;2023年1月份的NFT…

计算机网络-http协议版本对比

概述 HTTP 是基于 TCP/IP 协议的一个应用层协议&#xff0c;是现代互联网的一个基础协议。规定了客户端与服务端之间的通信格式以及所占用的服务端口80(HTTPS是443)。 超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响…

【Flutter】Flutter Developer 101 入门小册 专栏指引

你好&#xff0c;我是小雨青年&#xff0c;一名程序员。 在2023年&#xff0c;我决定做这个Flutter专栏&#xff0c;从基础到部署&#xff0c;一站式解决大家对于Fulltter的学习需求。 目前本专栏的大概目录为本文最后所示&#xff0c;后续随着内容的不断更新&#xff0c;会逐…

2023年“华数杯”国际大学生数学建模B题赛题发布

ICM 问题B&#xff1a;社会稳定早期预警研究 背景 人类和所有的动物一样&#xff0c;都有寻求利益和避免伤害的本能。人类成为创造之主 的关键在于&#xff0c;他们比其他动物更善于避免伤害。危机总是潜伏着未来。人类发展的 历史是一部不断尝试超越危机的历史 (严耀军&#x…

鸿蒙开发学习|基础环境和开发工具

系列文章目录 第一章 HarmonyOS是什么 第二章 基础环境和开发工具 文章目录系列文章目录前言一、DevEco Studio工具简介二、DevEco Studio搭建开发流程1.运行环境要求2.下载和安装DevEco Studio三、安装HarmonyOS开发插件总结前言 HUAWEI DevEco Studio是基于IntelliJ IDEA C…