更文

简介: 更文

一、题目描述:

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

示例 1:

img

输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 的左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。
示例 2:

img

输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。

提示:

树上节点的数目在范围 [2, 1000] 内
-231 <= Node.val <= 231 - 1

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/recover-binary-search-tree

二、思路分析:

一个合格的二叉搜索树的中序遍历一定是个严格递增的序列,如果发生了交换,可能会有两种情况:

交换的是相邻的节点,即发现一个节点值小于其前一个节点值时,这两个节点就刚好是被交换的。
交换的是不相邻的节点,即发现了两次异常,第一次是:A节点值大于其后一个节点值,第二次是:B节点值小于其前一个节点值。A和B就是被交换的两个节点。

首先,二叉搜索树的中序遍历出的节点是有序的
其次,并没有说交换的节点是相邻的,所以不能直接交换 pre->val 与 root->val
所以我们要找到两个不符合前一个节点值小于后一个节点值的点。
最后,将两节点交换。
过程:第一次找到(前大后小),由于x == nullptr,所以x = pre,之后的遍历都不会再对x产生影响,
只会改变y的值。

三、AC 代码:

class Solution {
    public void recoverTree(TreeNode root) {
        Deque<TreeNode> stk = new ArrayDeque<>();
        TreeNode x = null, y = null, pre = null;
        while (root != null || !stk.isEmpty()) {
            while (root != null) {
                stk.offer(root);
                root = root.left;
            }
            root = stk.pollLast();
            if (pre != null && pre.val > root.val) {
                y = root;
                if (x == null) {
                    x = pre;
                } else {
                    break;
                }
            }
            pre = root;
            root = root.right;
        }
        // 交换节点
        int tmp = x.val;
        x.val = y.val;
        y.val = tmp;
    }

}

四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注Jam,从你我做起!

相关文章
|
供应链 前端开发 算法
技术人应该知道的电商运营小知识(上)
技术人应该知道的电商运营小知识(上)
719 0
|
存储 JSON 生物认证
harmony-utils之AssetUtil,关键资产存储服务工具类
AssetUtil 是 harmony-utils 工具库中的关键资产存储服务工具类,提供新增、查询、删除资产等功能,支持同步与异步操作,适用于 HarmonyOS 应用开发。
193 0
|
10月前
|
人工智能 自然语言处理 计算机视觉
华为鸿蒙自己家的“AI”编辑器插件用起来到底怎么样?
编辑器AI插件如Codegeex、通义灵码等已问世,但通用性较强而不专精。华为推出的CodeGenie专为鸿蒙开发设计,集成在DevEco 5.0.0以上版本中,提供代码补全、生成等功能,尤其擅长处理鸿蒙相关问题,极大降低了鸿蒙开发的门槛。安装后需重启,支持自然语言生成代码,提升了开发效率。
599 13
|
数据采集 人工智能 自然语言处理
重磅!IDC、钉钉联合发布 2024 AIGC 应用层十大趋势
重磅!IDC、钉钉联合发布 2024 AIGC 应用层十大趋势
476 1
|
XML Java 数据格式
Spring学习?这一篇文章就够,史上最全!
Spring学习?这一篇文章就够,史上最全!
364 1
|
Java
Java【代码分享 11】yaml配置List和Map参数对象的配置信息及类文件实例分享(效仿GatewayDynamic+DynamicDataSource的注入方法)
Java【代码分享 11】yaml配置List和Map参数对象的配置信息及类文件实例分享(效仿GatewayDynamic+DynamicDataSource的注入方法)
546 0
Flutter 自定义ICON库
Flutter 自定义ICON库 Flutter提供了一些内置的ICON库,但在实际开发中,可能需要一些自定义的ICON图标。Flutter允许我们使用自定义图标,本文将介绍如何创建和使用自定义ICON库。
440 0
|
存储 网络协议 Linux
网络缓冲区
网络缓冲区
226 0
|
XML JSON C++
C++的Json解析库:jsoncpp和boost .
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org/,本文不再对json做介绍,将重点介绍c++的json解析库的使用方法。
3148 0
|
JavaScript Java 关系型数据库
校园电商物流云平台 毕业设计 JAVA+Vue+SpringBoot+MySQL(一)
校园电商物流云平台 毕业设计 JAVA+Vue+SpringBoot+MySQL
242 0