Leetcode JAVA刷刷站(99)恢复二叉搜索树

news2024/12/25 9:30:48

一、题目概述

二、思路方向

       要解决这个问题,我们可以采用中序遍历二叉搜索树(BST)的方法,因为中序遍历BST会返回一个有序的数组。由于只有两个节点被错误地交换了,所以中序遍历的结果中将有两个位置上的元素是逆序的。

以下是一个可能的解决步骤:

  1. 对BST进行中序遍历,并将遍历的结果存储在数组中。
  2. 遍历这个数组,找到逆序的节点对(即两个相邻的元素,后一个比前一个小)。
  3. 交换这两个节点在BST中的值,而不是它们的位置,因为题目要求不改变树的结构。

三、代码实现 

class TreeNode {  
    int val;  
    TreeNode left;  
    TreeNode right;  
    TreeNode(int x) { val = x; }  
}  
  
public class Solution {  
    private TreeNode[] nodes;  
    private int index = 0;  
  
    public void recoverTree(TreeNode root) {  
        nodes = new TreeNode[1000]; // 假设树中的节点数不超过1000,可以根据实际情况调整  
        inorderTraversal(root);  
          
        // 找到逆序的两个节点  
        int first = -1, second = -1;  
        for (int i = 1; i < nodes.length && nodes[i] != null; i++) {  
            if (nodes[i].val < nodes[i - 1].val) {  
                if (first == -1) {  
                    first = i - 1;  
                }  
                second = i;  
            }  
        }  
  
        // 交换值  
        int temp = nodes[first].val;  
        nodes[first].val = nodes[second].val;  
        nodes[second].val = temp;  
    }  
  
    private void inorderTraversal(TreeNode node) {  
        if (node == null) return;  
        inorderTraversal(node.left);  
        nodes[index++] = node;  
        inorderTraversal(node.right);  
    }  
}

执行结果: 

四、小结

注意

  • 上述代码假设了树中的节点数不会超过1000,并据此初始化了nodes数组。如果树的大小可能非常大,你可能需要使用其他数据结构(如ArrayList)来存储中序遍历的结果。
  • 该方法通过遍历整个树来找到需要交换的节点,时间复杂度为O(n),其中n是树中的节点数。
  • 这种方法不改变树的结构,只是交换了节点的值。

进一步优化

  • 如果树中的节点数非常多,使用动态数据结构(如ArrayList)来存储中序遍历的结果会更加灵活。
  • 如果树的节点值有范围限制(如非负整数),并且这个范围不是特别大,可以使用一个固定大小的数组来统计每个值出现的次数,然后用一次遍历找到被交换的节点,但这需要额外的空间,并且假设了节点值的范围。

 结语 

如果你想要攀登高峰

切莫把彩虹当作梯子

!!!

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

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

相关文章

AD7606芯片驱动-FPGA实现

简介 AD7606是一款16位ADC芯片&#xff0c;可实现8通道并行采集&#xff0c;每通道最大速度可达1M&#xff0c;可实现多种模式数据采集。 介绍 本次FPGA使用的是8通道串行采样模式&#xff0c;设计中所用到的AD7606引脚说明如下&#xff1a; 名称定义CONVST同步采集转换开始信…

并发服务器开发基础

一、服务器模型 1. 单循环服务器&#xff1a; 单循环服务器在同一时刻只能处理一个客户端的请求。由于其结构简单&#xff0c;适合低负载的场景&#xff0c;但在并发请求增加时可能导致性能问题。 2. 并发服务器模型&#xff1a; 并发服务器可以同时响应多个客户端…

openzgy编译和测试应用

zgy是仅次于segy重要的地震数据格式,最早在petrel软件中使用,目前已基本成为行业标准,具有更快的数据存储效率。openzgy是其开源版本。 ZGY文件格式由Schlumberger公司开发,用于存储地震解释的三维数据。OpenZGY库提供了读写该格式的能力。存在C++和Python两种版本。对于P…

web应用程序之服务器部署

当一个web应用层序开发好后&#xff0c;无论你是用什么语言&#xff0c;最后都要考虑部署到服务器上测试使用&#xff0c;这里就常见的服务器上部署进行如下的摸索总结。WSGI&#xff08;Web Server Gateway Interface&#xff09;&#xff0c;翻译为Python web服务器网关接口&…

【与C++的邂逅】--- 模板初阶

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 与C的邂逅 本篇博客我们将了解C中泛型编程体现的一大利器 --- 模板&#xff0c;有了模板可以帮我们用户省力。 &#x1f3e0; 泛型编程 如何实现一个通…

二叉树的三个简单题

1、二叉树的第k个结点 思路解析 由题可知这是一棵二叉搜索树 它或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; 1. 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b; 2. 若它的右子树不空&#xff0c;则右子树…

LSTM唐诗生成

LSTM唐诗生成 1课程简介1-2递归神经网络RNN1-3RNN网络细节1-4LSTM网络架构2-1处理Minist数据集2-2RNN网络模型及训练3-1任务概述与环境配置3-2参数配置3-3数据预处理模块3-4batch数据制作3-5RNN模型定义3-8测试唐诗生成效果 1课程简介 使用深度网络模型 写首歌 写个剧本等 原…

openshift node NotReady kubelet http: TLS handshake error

文章目录 问题现象解决方法 问题现象 openshift 集群 node 节点 notready $ oc get node NAME STATUS ROLES AGE VERSION master1.ocp4.demo.com Ready control-plane,master 4d14h v1.29.76abe8a1 master2.ocp4…

折腾 Quickwit,Rust 编写的分布式搜索引擎-官方教程

快速上手 在本快速入门指南中&#xff0c;我们将安装 Quickwit&#xff0c;创建一个索引&#xff0c;添加文档&#xff0c;最后执行搜索查询。本指南中使用的所有 Quickwit 命令都在 CLI 参考文档 中进行了记录。 https://quickwit.io/docs/main-branch/reference/cli 使用 Qui…

光庭信息半年报:营收利润「双」下降,汽车软件业务竞争加剧

「软件定义汽车」概念&#xff0c;不可否认强化了软件在整车价值的权重、带动更多供应商争夺软件业务的同时&#xff0c;也同样埋下了不小的风险。 比如&#xff0c;在汽车行业&#xff0c;常见的软件业务有两种&#xff1a;1、软件许可/IP&#xff0c;这类产品服务主要集中于…

MacOS 本地打开android模拟器

MacOS 本地打开android模拟器 查看本地安卓模拟器&#xff1a;emulator -list-avds 注意&#x1f4e2;&#xff1a;这里会提示你找不到 emulator 命令&#xff0c;此时我们需要进入 cd ~/Library/Android/sdk/tools/ 查看模拟器列表&#xff1a;./emulator -list-avds 启动…

PHP概述-特点-应用领域-如何学习

老师建议注册使用百度文心一言&#xff1b;讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞&#xff1b;Kimi.ai - 帮你看更大的世界 等人工智能工具软件的一个到两个&#xff0c;也可下载文心一言、讯飞星火、kimi等APP软件使用&#xff0c;对于我们在读的大二学生来说有什么…

需方软件供应链安全保障要求及开源场景对照自评表(上)

国标《信息安全技术 软件供应链安全要求》确立了软件供应链安全目标&#xff0c;规定了软件供应链安全风险管理要求和供需双方的组织管理和供应活动管理安全要求。 开源软件供应链作为软件供应链的一种特殊形式&#xff0c;该国标亦适用于指导开源软件供应链中的供需双方开展组…

BaseCTF [Week2] 最简单的编码

前言&#xff1a;做题笔记。 下载解压 查壳。 64ida打开。 查找字符串。 跟进。 逆着向前看。 说明是密文。 里面是base64的变异加密。 原base64关键加密&#xff1a; &#xff08;看BaseCTF week1 [第一周]BasePlus 官方WP&#xff09; 变种后&#xff1a; 在此基础上加上了…

安卓系统 XBL阶段详解

在安卓系统的启动流程中&#xff0c;XBL&#xff08;eXtensible Boot Loader 或 Secondary Bootloader&#xff09;是一个关键阶段&#xff0c;特别是在使用QualComm&#xff08;高通&#xff09;等SOC&#xff08;System on Chip&#xff09;的设备上。以下是对XBL阶段的详细解…

Yololov5+Pyqt5+Opencv 实时城市积水报警系统

在现代城市生活中&#xff0c;积水问题不仅影响交通和人们的日常生活&#xff0c;还可能对城市基础设施造成潜在的威胁。为了快速、准确地识别和应对积水问题&#xff0c;使用计算机视觉技术进行智能积水检测成为一个重要的解决方案。在这篇博客中&#xff0c;我将带你一步步实…

数据结构(邓俊辉)学习笔记】串 08——KMP算法:再改进

文章目录 1. 美中不足2. 以卵击石3. 前车之覆4. 后车之鉴5. 可视对比 1. 美中不足 以上&#xff0c;我们不仅给出了 KMP 算法&#xff0c;同时也证明它的时间复杂度已经达到了渐进意义上的最优&#xff0c;也就是最坏情况也不超过 O(n)。而该算法目前这个版本也绝非完美无缺&am…

005、架构_数据节点

​DN组件总览 ​ DN节点包含进程 dbagent进程:主要提供数据节点高可用、数据导入导出、数据备份恢复、事务一致性、运维类功能、集群的扩缩容、卸数等功能;MySQL进程:主要提供数据一致性、分组管理、快同步复制、高低水位等;

机械学习—零基础学习日志(如何理解概率论10)

数理统计 这里X为总体。x1,x2,x3为样本。具体的取值为样本值。 抽样分布 来一道习题&#xff1a; 回答&#xff1a; 上一道题解析&#xff1a; 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版&#xff08;王志超&#xff09;》学习笔记 王志超老师 &#xff08;UP…

一张图认识视频中间件

之前我们有介绍了很多关于视频中间件的技术资料&#xff1a; 超视网络视频中间件平台详解 视频中间件&#xff1a;海康E-home私有协议接入&#xff0c;并输出标准FLV/HLS/RTSP流 视频中间件&#xff1a;大华IPC/NVR 主动注册协议接入并输出标准FLV/RTSP/HLS流 视频中间件&#…