Leetcode 99. 恢复二叉搜索树

Leetcode 99. 恢复二叉搜索树 中序遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; *... 阅读详情

题目

二叉搜索树中的两个节点被错误地交换。

请在不改变其结构的情况下,恢复这棵树。

在这里插入图片描述在这里插入图片描述
进阶:

  • 使用 O(n) 空间复杂度的解法很容易实现。
  • 你能想出一个只使用常数空间的解决方案吗?

解答

本题需要找到两个需要交换的结点使得二叉搜索树结构恢复。

思路:如若按照中序遍历的序列来讲,问题就转化为找中序遍历结果的两个逆序对。

中序遍历算法的复杂度如下:

  • 递归:O(n) 时间,O(n) 空间。
  • 栈:O(n) 时间,O(n) 空间。
  • Mirros 算法:O(n) 时间,O(1) 空间。

遍历方式一:递归

代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    TreeNode firstNode = null;
    TreeNode secondNode = null;
    TreeNode pre = new TreeNode(Integer.MIN_VALUE);
    
    public void recoverTree(TreeNode root) {
        inOrder(root);
    
        int temp = firstNode.val;
        firstNode.val = secondNode.val;
        secondNode.val = temp;
    }

    private void inOrder(TreeNode node) {
        if (node == null) return;
        
        inOrder(node.left);
        
        if(firstNode == null && pre.val > node.val) firstNode = pre;
        if(firstNode != null && pre.val > node.val) secondNode = node;
        pre = node;
        
        inOrder(node.right);
    }
}
结果

在这里插入图片描述

遍历方式二:栈

代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public void recoverTree(TreeNode root) {
        TreeNode firstNode = null;
        TreeNode secondNode = null;
        LinkedList<TreeNode> stack = new LinkedList<>();
        TreeNode pre = new TreeNode(Integer.MIN_VALUE);   
        TreeNode cur = root;
        while(cur != null || !stack.isEmpty()) {
            while(cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            
            cur = stack.pop();
            
            if(firstNode == null && pre.val > cur.val) firstNode = pre;
            if(firstNode != null && pre.val > cur.val) secondNode = cur;
            pre = cur;
            
            cur = cur.right;
        }
        
        int temp = firstNode.val;
        firstNode.val = secondNode.val;
        secondNode.val = temp;
    }
}
结果

在这里插入图片描述

遍历方式三:Mirros算法

代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public void recoverTree(TreeNode root) {
        TreeNode firstNode = null;
        TreeNode secondNode = null;
        TreeNode cur = root;
        TreeNode last = null;
        TreeNode pre = new TreeNode(Integer.MIN_VALUE);  
        while(cur != null) {
            if(cur.left == null) {
                if(firstNode == null && pre.val > cur.val) firstNode = pre;
                if(firstNode != null && pre.val > cur.val) secondNode = cur;
                pre = cur;
                cur = cur.right;
            } else {
                last = cur.left;
                while(last.right != null && last.right != cur) {
                    last = last.right;
                }
                
                if(last.right == null) {
                    last.right = cur;
                    cur = cur.left;
                }
                
                if(last.right == cur) {
                    last.right = null;
                    if(firstNode == null && pre.val > cur.val) firstNode = pre;
                    if(firstNode != null && pre.val > cur.val) secondNode = cur;
                    pre = cur;
                    cur = cur.right;
                }
            }
        }
       
        int temp = firstNode.val;
        firstNode.val = secondNode.val;
        secondNode.val = temp;
    }
}
结果

在这里插入图片描述

C/C++ 镜子mirror算法详解及源码 镜子(mirror)算法是一种常见的图像处理算法,它用于将一个图像沿着某个轴进行镜像翻转,使得图像中的左右部分互相对称。镜子(mirror)算法是一种常见的图像处理算法,它用于将一个图像沿着某个轴进行镜像翻转,使得图像中的左右部分互相对称。镜子(mirror)算法是一种常见的图像处理算法,它用于将一个图像沿着某个轴进行镜像翻转,使得图像中的左右部分互相对称。镜子(mirror)算法是一种常见的图像处理算法,它用于将一个图像沿着某个轴进行镜像翻转,使得图像中的左右部分互相对称。 阅读详情

相关推荐

【中等】力扣算法题解析LeetCode99:恢复二叉搜索树

本文探讨了如何恢复二叉搜索树中被错误交换的两个节点的问题。通过分析二叉搜索树中序遍历的有序特性,发现交换节点会导致逆序对的出现。文章提出使用Morris中序遍历算法,在O(1)空间复杂度下高效定位错误节点。具体步骤包括:初始化错误节点变量,遍历时比较当前节点与前驱节点的值,记录逆序对,最后交换错误节点的值。该算法避免了递归或显式栈的使用,实现了高效的空间利用。文章还提供了Java代码实现和详细说明,帮助读者理解算法逻辑和实现细节。

ylumwd的博客 618

二叉树遍历之图解Mirror算法(莫里斯算法)

我们写二叉树的遍历时,一般有两种方式,迭代和递归。然而还有一种神奇的算法,也可以作我们的二叉树递归,且空间复杂度为O(1),要知道,我们迭代和递归都是需要额外栈空间的

small_engineer的博客 2740

别再为Word转PDF表格变形发愁了!Aspose.Words for Java 19.5 保姆级避坑指南

本文详细介绍了使用Aspose.Words for Java 19.5解决Word转PDF时表格变形问题的完整方案。从格式转换原理到实战技巧,涵盖固定表格宽度、禁用自动调整、强制文本换行等核心方法,并提供高级场景应对策略和性能优化建议,帮助开发者高效处理复杂文档转换需求。

weixin_28702105的博客 266

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

Leetcode JAVA刷刷站——恢复二叉搜索树篇

m0_73399576的博客 766

华为MA5626 ONU开局配置实战:从零到业务就绪的完整命令手册

本文详细介绍了华为MA5626 ONU设备的开局配置全流程,包括物理连接、命令行初始化、业务VLAN划分、PoE功能配置及故障排查。通过实战命令手册,帮助网络工程师快速完成从设备上电到业务就绪的完整配置,特别适合FTTB场景部署。

weixin_26934905的博客 561

基于STM32 HAL库的L298N四驱电机PWM调速与方向控制实战

本文详细介绍了基于STM32 HAL库驱动L298N电机控制板实现四驱小车PWM调速与方向控制的实战方法。涵盖硬件连接、GPIO与定时器配置、PWM生成、方向控制逻辑及电源管理等核心内容,并提供代码优化与常见问题解决方案,帮助开发者快速实现高效稳定的电机控制。

jump7的博客 222

mirror算法 O(1)空间复杂度实现二叉树遍历

相比O(N)时间复杂度 O(h)空间复杂度的二叉树遍历,提出O(1)空间复杂度的mirror算法

weixin_42662358的博客 542

FreeSWITCH编译安装详细文档

本文档详细介绍了在Ubuntu 22.04系统上从源码编译安装FreeSWITCH的完整流程。主要内容包括:1)系统环境准备和依赖库安装;2)关键依赖库spandsp和sofia-sip的编译安装;3)FreeSWITCH源码的特定版本(v1.6.0)编译配置,包括禁用SignalWire模块的配置方法;4)系统服务配置,包括创建专用用户、设置权限以及配置systemd服务文件。文档特别提供了版本控制说明,确保后期能切换到相同的版本环境,并附有详细的命令操作步骤和注意事项。

唯有代码让我痴狂 1369

leetcode 99. 恢复二叉搜索树-java实现

传统的中序遍历 递归和 必要背过的(Morris-traversal) O(n)算法给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树。代码案例:输入:root = [1,3,null,null,2]输出:[3,1,null,null,2]解释:3 不能是 1 的左孩子,因为 3 > 1。交换 1 和 3 使二叉搜索树有效。

qq_41810415的博客 688

大数据面试 逻辑题

逻辑题大致分为比较逻辑题、分析逻辑题、综合逻辑题、抽象逻辑题、概括逻辑题、推理逻辑题、论证逻辑题等,由于这类题比较考验综合素质,因此也一直是各大企业笔试、面试时经常喜欢考察的题目类型之一。很多童鞋认为逻辑题很难,其实不然。多做练习,打开思路,这类题还是可以轻易化解的。 下面为大家整理了网络上最全的75道逻辑判断测试题。在每道题目下方有答案,是用白色显示的,反选就可以看到啦~ 【1】假设有一个池...

zzq_0916s的博客 4421

Linux 服务器上部署 OpenClaw完整教程

2. 全局安装 OpenClaw 3. 初始化配置 配置模型提供商 方式一:使用配置命令(推荐) 方式二:直接编辑配置文件 在 部分添加: 配置多个模型提供商 如果你使用 Antigravity 本地代理,可以同时配置多个模型: 配置飞书集成 1. 创建飞书应用 访问 飞书开放平台 创建企业自建应用 记录 App ID 和 App Secret 2. 配置应用权限 在飞书开放平台,为应用添加以下权限:重要: 必须使用 长连接(WebSocket) 模式,不要使用 HTTP 回调!在飞书开放

Maynor的博客 5247

Java实现 LeetCode 99 恢复二叉搜索树

99. 恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出: [3,1,null,null,2] 3 / 1 \ 2 示例 2: 输入: [3,1,4,null,null,2] 3 / \ 1 4 / 2 ...

南 墙 1万+

2026 企查查/天眼查:IP频率限制 + 验证码策略,企业工商数据采集实战

企业工商数据采集技术解析与解决方案 本文深度剖析了2026年企查查和天眼查平台的反爬机制与技术对抗方案。主要内容包括: 反爬机制分析: 采用JA4+ TLS指纹识别、极验v6验证码等多层防护 IP限制策略严格区分未登录/普通/VIP账号 精准识别并封禁数据中心IP 核心解决方案: 构建高可用住宅代理池,动态轮换真实用户IP 基于YOLOv8的验证码缺口识别技术(准确率99%) 分布式架构设计,支持千万级数据采集 多账号池管理与行为模拟技术 技术亮点: 动态住宅IP池实现1%以下封禁率 Playwright浏

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1324

LeetCode 力扣 99. 恢复二叉搜索树

题目描述(困难难度) 依旧是二分查找树的题,一个合法的二分查找树随机交换了两个数的位置,然后让我们恢复二分查找树。不能改变原来的结构,只是改变两个数的位置。二分查找树定义如下: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 任意节点的左、右子树也分别为二叉查找树; 没有键值相等的节点。 解法一 ...

wind_liang的博客 1022

SAPGUI 与 ADT 的时代分野:在多云架构下,谁还能代表现代 SAP 开发

摘要(149字) SAP开发工具正经历代际更迭:SAPGUI基于专有协议(NI/DIAG)的厚客户端架构难以适配多云环境,而ADT(ABAP Development Tools)通过HTTP(S)协议和Eclipse生态成为ABAP Cloud/RAP开发的唯一入口。关键差异体现在:ADT支持CDS、行为定义等云原生对象建模,天然对齐BTP的零信任网络;集成ATC、Git等DevOps工具链;而SAPGUI无法创建RAP核心对象,在跨平台、自动化方面存在硬限制。官方文档明确将ADT作为Clean Core战

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 388

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Leetcode 99. 恢复二叉搜索树 C++

Leetcode 99. 恢复二叉搜索树 题目 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 测试样例 1. 输入: [1,3,null,null,2] 1 / 3 \ 2 输出: [3,1,null,null,2] 3 / 1 \ 2 2. 输入: [3,1,4,null,null,2] 3 / \ 1 4 / 2 输出: [2,1,4,null,null,3] 2 / \ 1 4

weixin_43750513的博客 464

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LeetCode 力扣 99. 恢复二叉搜索树 recoverTree

大家觉得写还可以,可以点赞、收藏、关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录99. 恢复二叉搜索树示例 1:示例 2:进阶:分析朴素二叉树定义方法分析代码实现栈思路分析复杂度分析代码实现提交结果在这里插入图片描述 99. 恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2

motongxue的博客 332

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LeetCode第99题_恢复二叉搜索树

给你二叉搜索树的根节点root,该树中的两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树。

qq_40263592的博客 1020

LeetCode 99. 恢复二叉搜索树

LeetCode 99. 恢复二叉搜索树 题目 99. 恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出: [3,1,null,null,2] 3 / 1 \ 2 示例 2: 输入: [3,1,4,null,null,2] 3 / \ 1 4 / 2 输出: [2,1,4,null,null,3]

qq_42499133的博客 742

力扣第99题 - 恢复二叉搜索树

Morris遍历是一种在二叉树上实现中序遍历的算法,不需要递归或栈辅助,能够达到 (O(1)) 空间复杂度。我们需要通过中序遍历找到这两个错误的节点,并交换它们的值恢复树。,请你恢复该二叉搜索树,使其满足二叉搜索树的定义。:(O(n)),因为数组需要存储所有节点。:(O(n)),因为需要一次中序遍历。给你二叉搜索树的根节点。

weixin_48941116的博客 629

LeetCode第99题----恢复二叉搜索树

今天分享LeetCode第99题:恢复二叉搜索树 文章目录前言一、题目描述二、思想和方法详述1.解题思想2.解题步骤详述总结 前言 本文将用图文并用的方式来较详细的阐述LeetCode第99题的解题过程和思路。 本人才疏学浅,如有错误请多担待并联系本人,感谢各位给本人一个学习的机会。 一、题目描述 给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。 示例: 二、思想和方法详述 1.解题思想 解题之前先谈何为搜索二叉树,简单地说,搜索二叉树就是根

F & F的博客 1208

leetcode 99. 恢复二叉搜索树(C++)

leetcode 99. 恢复二叉搜索树(C++):在不改变二叉搜索树结构的情况下,恢复这棵树错误地交换的两个节点。

nanashi_F的博客 547

LeetCode-99. 恢复二叉搜索树

3 / 1 \ 2 示例2: 输入: [3,1,4,null,null,2] 3 / \ 1 4 / 2 输出: [2,1,4,null,null,3] 2 / \ 1 4 / 3 进阶: 使用 O(n) 空间复杂度的解法很容易实现。 你能想出一个只使用常数空间的解决方案吗? 1. 中序遍历,存储数组 2. 排序数...

保持对编程的热情! 228

leetcode 99. 恢复二叉搜索树

leetcode 99. 恢复二叉搜索树 题目详情 题目链接 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出: [3,1,null,null,2] 3 / 1 \ 2 示例 2: 输入: [3,1,4,null,null,2] 3 / \ 1 4 / 2 输出: [2,1,4,null,null,3] 2 / \ 1 4 / 3 进阶: 使用 O(n) 空间复杂度的解法很容易实现。

qq_33789406的博客 183

【LeetCode】99. 恢复二叉搜索树

二叉搜索树恢复问题要求交换两个错误节点的值来修复BST。通过中序遍历的递增性质,可以高效检测出错误节点:当出现前节点值大于当前节点值时记录逆序对。相邻交换只需交换单个逆序对,非相邻交换则需交换第一个逆序对的前节点和最后一个逆序对的后节点。最优解法采用O(1)空间的Morris遍历,在遍历过程中动态修改树结构并记录错误节点,最后进行值交换。时间复杂度O(n),空间复杂度O(1)。

qq_32019341的博客 905

LeetCode 99. 恢复二叉搜索树 python

99. 恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 示例 1: 输入: [1,3,null,null,2] 1 / 3 2 输出: [3,1,null,null,2] 3 / 1 2 示例 2: 输入: [3,1,4,null,null,2] 3 / 1 4 / 2 输出: [2,1,4,null,null,3] 2 / 1 4 / 3 方法一:显式中序遍历: # Definition for a binary tree node. # cl

buglesxu的博客 435
上一篇: Leetcode 98. 验证二叉搜索树
下一篇: Leetcode 100. 相同的树
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值