【LeetCode刷题-树】-- 99.恢复二叉树

99.恢复二叉树

image-20231211095657561

方法:

  • 对二叉搜索树进行中序遍历得到值序列不满足的位置
  • 找到对应被错误交换的节点记为x和y
  • 交换x和y两个节点
/**
 * 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 {
    public void recoverTree(TreeNode root) {
        //定义一个数组 记录二叉搜索树的中序遍历
        List<Integer> num = new ArrayList<Integer>();
        inorder(root,num);
        int[] swap = findToSwapped(num);
        recover(root,2,swap[0],swap[1]);
    }

    public void inorder(TreeNode root,List<Integer> num){
        if(root == null){
            return;
        }
        inorder(root.left,num);
        num.add(root.val);
        inorder(root.right,num);
    }

    public int[] findToSwapped(List<Integer> num){  //排序是升序排列的,需要找到ai>ai+1和aj>aj+1对应的值
        int n = num.size();
        int index1 = -1, index2 = -1;
        for(int i = 0; i < n - 1 ; i++){
            if(num.get(i + 1) < num.get(i)){
                index2 = i + 1;
                if(index1 == -1){
                    index1 = i;
                }else{
                    break;
                }
            }
        }
        int x = num.get(index1),y = num.get(index2);
        return new int[]{x,y};
    }

    public void recover(TreeNode root,int count,int x,int y){
        if(root!=null){
            if(root.val == x || root.val == y){
                root.val = root.val == x ? y:x;
                if(--count==0){
                    return;
                }
            }
            recover(root.left,count,x,y);
            recover(root.right,count,x,y);
        }
    }
}

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

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

相关文章

C++ 教程 - 01 基础篇

文章目录 C介绍环境配置第一个cpp程序案例练习 变量常量关系运算符逻辑运算符条件运算符位运算符类型转换分支循环程序调用综合案例 C介绍 基于C语言&#xff0c;继承了C的所有语法&#xff1b; 静态类型语言&#xff0c;需要先编译&#xff0c;再执行&#xff1b; 贴近底层硬…

20、关联容器、无序容器

20、关联容器、无序容器 关联容器mapmultimapsetmultiset 无序容器哈希unordered_map 关联容器 map // map的使用 #include <iostream> #include <map> #include <stdexcept> using namespace std;class Student{ public:Student(const string& name&qu…

【计算机网络】TCP socket编程

目录 ​编辑 一、前言 二、概念 1、通信模型&#xff1a; 2、端口&#xff1a; 3、IP地址&#xff1a; 4、协议&#xff1a; 三、简单搭建 1、服务器代码 2、客户端代码 一、前言 Socket&#xff08;套接字&#xff09;是计算机网络中用于实现进程之间通信的一种机制…

Nacos配置管理-微服务配置拉取

yaml已配置内容 目录 一、配置获取步骤 二、统一配置管理步骤 三、Nacos管理配置的步骤总结 一、配置获取步骤 二、统一配置管理步骤 1、引入Nacos的配置管理客户端依赖: <!--nacos配置管理依赖--> <dependency> <groupId>com.alibaba.cloud&l…

企业欠税信息API:实现税务管理的智能化与高效化

前言 随着经济的发展和社会的进步&#xff0c;企业欠税问题逐渐凸显&#xff0c;成为制约经济发展的重要因素。为了解决这一问题&#xff0c;企业欠税信息API应运而生。它通过先进的技术手段&#xff0c;提供了一种全新的欠税信息查询方式&#xff0c;帮助企业实现税务管理的智…

免费的AI改写工具推荐,AI改写工具大全

在本文中&#xff0c;我们将专心分享AI改写的方法、工具以及技巧&#xff0c;旨在帮助大家更好地理解和利用写作利器。我们将揭示AI改写的背后原理&#xff0c;探讨目前市场上主流的AI改写工具&#xff0c;并分享一些提高改写效果的使用技巧。 AI改写的背后技术原理 在深入讨…

阶乘后的零

题目链接 阶乘后的零 题目描述 注意点 返回 n! 结果中尾随零的数量 解答思路 阶乘后有多少个0&#xff0c;取决于乘法计算中有多少个2 * 5&#xff08;只有2 * 5的结果是10有尾随0&#xff09;&#xff0c;又因为在阶乘中2的数量一定多于5的数量&#xff0c;所以阶乘后有多…

AIGC实战——WGAN(Wasserstein GAN)

AIGC实战——WGAN 0. 前言1. WGAN-GP1.1 Wasserstein 损失1.2 Lipschitz 约束1.3 强制 Lipschitz 约束1.4 梯度惩罚损失1.5 训练 WGAN-GP 2. GAN 与 WGAN-GP 的关键区别3. WGAN-GP 模型分析小结系列链接 0. 前言 原始的生成对抗网络 (Generative Adversarial Network, GAN) 在…

PyTorch深度学习实战——人群计数

PyTorch深度学习实战——人群计数 0. 前言1. 人群计数1.1 基本概念1.2 CRSNet 架构 2. 使用 CSRNet 实现人群计数2.1 模型分析2.2 数据集分析2.3 模型构建与训练 相关链接 0. 前言 人群计数是指通过图像或视频分析技术&#xff0c;对给定场景中的人群数量进行估计和统计的过程…

【MATLAB】REMD信号分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 TVFEMDFFTHHT组合算法是一种结合了总体变分模态分解&#xff08;TVFEMD&#xff09;、傅里叶变换&#xff08;FFT&#xff09;和希尔伯特-黄变换&#xff08;HHT&#xff09;的信号分解方…

多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现RIME-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现RIME-CNN-…

微信小程序:用map()将对象数组中的某一项组合成新数组

使用分析 使用map()方法来遍历 info 数组中的每个元素&#xff0c;并整合每一个对象中的某一项进行新数组的重组 效果展示 这里是查询对象数组中的全部name值 原始数据 提取出name的数组 核心代码 var infos items.map(item > item.name); 完整代码&#xff08;用微信小程…

基于hadoop下的spark安装

目录 简介 安装准备 spark安装 配置文件配置 简介 Spark主要⽤于⼤数据的并⾏计算&#xff0c;⽽Hadoop在企业主要⽤于⼤数据的存储&#xff08;⽐如HDFS、Hive和HBase 等&#xff09;&#xff0c;以及资源调度&#xff08;Yarn&#xff09;。但是也有很多公司也在使⽤MR2进…

Web server failed to start. Port 8888 was already in use.

端口占用 强制终止占用端口的进程 获取占用端口的进程ID&#xff08;PID&#xff09;&#xff1a;在终端或命令提示符中运行以下命令以查找占用端口的进程ID&#xff1a; ①在 Unix/Linux/Mac 上&#xff1a;lsof -i :8888 ②在 Windows 上&#xff1a;netstat -ano | findstr …

HTML面试题---专题二

文章目录 一、前言二、解释input标签中占位符属性的用途三、如何在 HTML 中设置复选框或单选按钮的默认选中状态&#xff1f;四、表单输入字段中必填属性的用途是什么&#xff1f;五、如何使用 HTML 创建表格&#xff1f;六、解释a标签中目标属性的用途七、如何创建一个点击后会…

Java飞翔的小鸟

一、项目分析 创建一个窗口和画板&#xff0c;把画板放到窗口上&#xff0c;在画板上绘画图片 &#xff08;2&#xff09;让小鸟在画面中动起来&#xff0c;可以上下飞 &#xff08;3&#xff09;让地面和管道动起来 &#xff08;4&#xff09;碰撞检测 &#xff08;5&#xf…

Nginx 优化与防盗链

目录 配置Nginx隐藏版本号 Nginx隐藏版本号的方法 修改配置文件法 修改源码法 修改用户与组 设置缓存时间 日志切割 连接超时 更改进程数 配置网页压缩 配置防盗链 fpm参数优化 总结&#xff1a;nginx优化 配置Nginx隐藏版本号 可以使用 Fiddler 工具抓取数据包&…

【Citespace】从Citespace开始的引文可视化分析

CiteSpace 译“引文空间”&#xff0c;是一款着眼于分析科学分析中蕴含的潜在知识&#xff0c;是在科学计量学、数据可视化背景下逐渐发展起来的引文可视化分析软件。由于是通过可视化的手段来呈现科学知识的结构、规律和分布情况&#xff0c;因此也将通过此类方法分析得到的可…

巧用ChatGPT高效搞定Excel数据分析【文末送书-04】

文章目录 一.巧用ChatGPT高效搞定Excel数据分析1. ChatGPT简介2. 安装所需工具2.1 Python2.2 OpenAI GPT库 3. 与ChatGPT交互进行数据分析4. 利用ChatGPT进行筛选和排序5. ChatGPT的局限性和注意事项6. ChatGPT与数据可视化7. ChatGPT与进阶数据分析任务 二. 结论&文末福利…

Windows安装Maven

一、Maven 是什么&#xff1f; Maven 是一个项目管理和整合工具。Maven 为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置&#xff0c;因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。 在有多个开发团…