Day21|二叉树part07:530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

news2024/9/23 7:28:23

530. *二叉搜索树的最小绝对差(双指针题型)

众所周知二叉搜索树的中序遍历序列是一个有序数组,因此最基本的方法就是遍历得到中序序列再进行计算,实际上可以用双指针法,记录中序遍历前一个指针和当前指针的差值:

class Solution {
    private int res = Integer.MAX_VALUE;
    private TreeNode pre = null;

    private void traversal(TreeNode cur){
        if(cur == null){
            return;
        }
        traversal(cur.left);
        if(pre != null){
            res = Math.min(res, Math.abs(cur.val - pre.val));
        }
        pre = cur;
        traversal(cur.right);
    }
    public int getMinimumDifference(TreeNode root) {
        traversal(root);
        return res;
    }
}

501.二叉搜索树中的众数

这里分两种方法,一种是当作普通的二叉树来做,一种是利用BST的性质来做。

  • 使用普通的二叉树,遍历一遍,将频率用Map存储,然后找到频率最高的。
class Solution {
        private Map<Integer, Integer> times = new HashMap<>();

        void traversal(TreeNode node) {
            if (node == null) {
                return;
            }
            traversal(node.left);
            times.put(node.val, times.getOrDefault(node.val, 0) + 1);
            traversal(node.right);
        }

        public int[] findMode(TreeNode root) {
            //1. 得到(值,频率)的map
            traversal(root);
            int maxCount = 0;
            for(Integer count: times.values()){
                maxCount = Math.max(maxCount, count);
            }
            
            //2. 将频率最高的key找到
            List<Integer> res = new ArrayList<>();
            for (Map.Entry<Integer, Integer> entry : times.entrySet()) {
                if (entry.getValue() == maxCount) {
                    res.add(entry.getKey());
                }
            }
            
            //3. 根据key去找value并转化成数组
            int[] result = new int[res.size()];
            for (int i = 0; i < res.size(); i++) {
                result[i] = res.get(i);
            }
            return result;
        }
    }
  • java的数组真的太麻烦了,又是Map转List再转数组的,不要乱;

利用BST性质的解法:

class Solution {
        public void test(){
            TreeNode root = new TreeNode(0);
//            root.right = new TreeNode(2);
//            root.right.left = new TreeNode(2);
            findMode(root);
        }
        private List<Integer> res = new ArrayList<>();
        private int count = 0;

        private int maxCount = 0;
        private TreeNode pre = null;

        void traversal(TreeNode node) {
            if(node == null){
                return;
            }
            traversal(node.left);
            if(pre == null){
                count = 1;
            }else if(node.val == pre.val){
                count++;
            }else{
                count = 1;
            }
            pre = node;
            if(count == maxCount){
                res.add(node.val);
            }
            if(count > maxCount){
                maxCount = count;
                res.clear();
                res.add(node.val);
            }

            traversal(node.right);
        }

        public int[] findMode(TreeNode root) {
            traversal(root);
            int[] array = res.stream().mapToInt(i->i).toArray();
            return array;
        }
    }
  • 也是需要两个指针一个pre一个cur,这样只遍历一次二叉树就可以获取众数节点。

236. ***二叉树的最近公共祖先(LCA)

  • 公共祖先的定义:

“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

这里是求最近公共祖先。因为root是所有节点的公共祖先 )

  • 需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。
  • 解法思路:如果一个节点能够在它的左右子树中分别找到 pq,则该节点为 LCA 节点。这样可以借助find函数得到本题的解法:
  • 判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。
class Solution {
    private TreeNode find(TreeNode node, TreeNode p, TreeNode q){
        if(node == null || node == p || node == q){
            return node;
        }
        TreeNode left = find(node.left, p ,q);
        TreeNode right = find(node.right, p , q);
       if(left != null && right != null){
           return node;
       }else if(left != null && right == null){
           return left;
       }else if(left == null && right != null){
           return right;
       }else{
           return null;
       }
    }
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {

        return find(root, p ,q);
    }
}
  • 在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)

image

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

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

相关文章

一个bitter组织下载器样本分析

BITTER 该组织最早在2016由美国安全公司Forcepoint进行了披露&#xff0c;并且命名为“BITTER”&#xff0c;同年国内友商360也跟进发布了分析报告&#xff0c;命名为“蔓灵花” 样本分析 MD5&#xff1a;806626d6e7a283efffb53b3831d53346 vt:看文件名判断是伪装成pdf的自解…

小学生古诗文大会往届真题测一测(来自主办方)和非常详细的解析

新学期开学一眨眼已经过了一个多月了&#xff0c;有家长朋友开始关心2024年上海市小学生古诗文大会什么时候开始&#xff1f;如何准备小学生古诗文大会&#xff1f;如何激发孩子学习古诗词的兴趣&#xff1f;如何提高小学古诗词和古诗文大会的学习成绩&#xff1f;... 最近&…

YT8531调试记录

总结 还是从设备树&#xff0c;mac驱动&#xff0c;mac驱动对mdio总线的注册&#xff0c;phy驱动 &#xff0c;phy的datasheet&#xff0c;cpu的datasheet 几个方面来看来看 0.确认供电&#xff0c;以及phy的地址(一般会有多个地址&#xff0c;根据相关引脚电平可配置) 1.确…

Linux离线安装mysql,node,forever

PS:本文是基于centos7实现的,要求系统能够查看ifconfig和unzip解压命令, 实现无网络可安装运行 首先现在百度网盘的离线文件包****安装Xftp 和 Xshell 把机房压缩包传到 home目录下****解压unzip 包名.zip 获取IP先获取到 linux 主机的ip ifconfig Xftp 连接输入IP,然后按照…

CentOS使用Docker部署Halo并结合内网穿透实现公网访问本地博客

文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 本文主要介绍如何在CentOS 7系统使…

搭建本地局域网域名并配置本地的mqtt服务器

1. 第一步&#xff1a; 首先准备一台windows电脑&#xff0c;安装 Technitium DNS Server 链接如下&#xff1a; Technitium DNS Server | An Open Source DNS Server For Privacy & Security 启动 start 然后进入 http://localhost:5380/ 下载完成之后&#xff0c;需要…

内网端口如何映射到外网?

内网端口映射到外网是一项重要的网络技术&#xff0c;它可以实现在任何网络环境下远程访问和管理内网设备。在复杂的网络环境中&#xff0c;内网设备通常无法直接被外网访问&#xff0c;而内网端口映射技术可以解决这个问题。本文将介绍一种名为【天联】的组网产品&#xff0c;…

最小割问题合集,最大权闭合图,最大密度子图,最小权点覆盖,最大权独立子图,OJ练习,代码详解

文章目录 零、回顾1、流网络的割2、最小割问题 一、最小割的应用1.1POJ1966 -- Cable TV Network1.1.1原题链接1.1.2思路分析1.1.3AC代码 1.2ZOJ 2676 Network Wars1.2.1原题链接1.2.2思路分析1.2.3AC代码 1.3OPTM - Optimal Marks1.3.1原题链接1.3.2思路分析1.3.3AC代码 二、最…

VS2022 nuget 无法解析 PackageSourceMapping 已启用,未考虑以下源: nuget.org。

前言&#xff1a; VS中的项目包的指向是 nuget.org&#xff0c;不是本地的下载后包。 解决方法&#xff1a; 把“包源映射”里的全部移除。

tcp/ip是什么意思,tcp/ip协议包含哪几层

TCP/IP是一种网络通信协议&#xff0c;它是互联网所采用的基本协议。TCP/IP协议是由美国国防部高级研究计划局&#xff08;ARPA&#xff09;在上世纪70年代设计开发的&#xff0c;经过多年发展和完善&#xff0c;已成为全球范围内最重要的网络通信协议之一。 首先&#xff0c;让…

Gif动图怎么快速制作?两招教你在线做

Gif动图作为一种实用的图片格式&#xff0c;因为其体积小&#xff0c;画面丰富&#xff0c;所以在各大聊天软件中非常的受欢迎。小伙伴们是不是很好奇这种gif动态图片是如何制作的吧&#xff01;下面&#xff0c;小编就给大家分享两个快速制作gif动画的小技巧&#xff01;不用下…

UI 自动化里面等待方式应用场景!

掌握Selenium 自动化测试的人员都知道Selenium的等待使用场景至关重要&#xff0c;这些等待对于测试自动化稳定性不可或缺的一部分&#xff0c;因为它们确保与 Web 元素的同步交互&#xff0c;从而能够在不同的加载时间和动态页面更改中准确执行测试脚本。 本文将深入探讨 Sel…

黄金近期可以投资吗?看这篇技术分析就够了

黄金价格的走势很大程度上受到美联储货币政策&#xff0c;以及市场对于美联储货币政策预期变化的影响&#xff0c;但不管金价的走势如何改变&#xff0c;现货黄金作为一种可以双向操作的黄金交易工具&#xff0c;都可以帮助投资者在不同的走势中主动出击&#xff0c;在风险可控…

el-table 表格中插入表单循环校验

<template><div>{{form}}<el-form :model"form" ref"form"><el-form-item label"呃呃呃呃呃呃呃"><el-table :data"tableData" border><el-table-column prop"time" label"日期"…

Jira 软件缺陷管理 (软件测试)

内容来源&#xff1a;总结黑马课程 1.软件缺陷信息 2.创建缺陷问题 2.1 缺陷模板 2.2 创建缺陷问题模板

linux + gitee+idea整套配置以及问题详解

目录&#xff1a; 1、安装git 2、git配置 3、git和gitee账户建立安全链接 4、gitee创建仓库 5、idea配置gitee 6、克隆提交代码 1、安装git 使用到github上下载最新版&#xff0c;上传到你的服务器&#xff0c;再进行解压。 这里是我的压缩包。解压命令&#xff1a; cd /usr/g…

ABAP程序代码批量导出

运行界面 *&---------------------------------------------------------------------* *& Report ZZ0001 *& *&---------------------------------------------------------------------* *& *& *&-----------------------------------------…

那位拿了多个Offer的大佬分享了最新Go面经

和大家分享一下我们 Go就业训练营 和 升职加薪星球 中战友们投稿的真实面经。 这是第一篇&#xff0c;计划还会再更新4篇最新Go面经&#xff0c;都是拿到Offer的那种&#xff01; 欢迎大家关注我的账号&#xff0c;关注之后不迷路。 先秀战绩 虽然不同的公司考察的侧重点不一…

宜搭低代码高级认证实操题1 todolist

进行中待办 已完成待办 待办事项 待办事项远程api和变量配置 回调函数 function didFetch(content) {//console.log(content.data);// content.b 1; 修改返回数据结构中的 b 字段为1let res content.data;let todoList [];for(let i in res){todoList.push(res[i]);}consol…

MVC框架里的几种对象

Java语言是一门面向对象的编程语言&#xff0c;所有都用类表达&#xff0c;入口都是一个类&#xff0c;没有独立的main&#xff08;&#xff09;函数&#xff0c;类的实例化就是对象。 简单来讲类包括数据和方法&#xff0c;方法就是操作&#xff0c;是实现业务逻辑的地方&…