恢复二叉搜索树

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

示例 1:

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

示例 2:

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

思路:

二叉搜索树按中序遍历是一个递增的序列,我们只需找到两个错误的节点即可。

在遍历过程中,不满足递增时,就意味着出现了要交换的点(这种情况共两次,分别对应两个错误的节点)

python 复制代码
if root.val < self.pre.val:
      self.index2 = root
      if self.index1 == None:
         self.index1 = self.pre

这个交换很巧妙,可以实际演示一遍,index1和index2正好可以记录下两个错误的节点。

代码如下:

python 复制代码
# Definition for a binary tree node.
from typing import Optional


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def recoverTree(self, root: Optional[TreeNode]) -> None:
        """
        Do not return anything, modify root in-place instead.
        """

        def inorder(root):
            if not root:
                return
            inorder(root.left)
            if root.val < self.pre.val:
                self.index2 = root
                if self.index1 == None:
                    self.index1 = self.pre
            self.pre = root
            inorder(root.right)

        self.pre = TreeNode(-float('inf'))
        self.index1 = None
        self.index2 = None
        inorder(root)
        self.index1.val, self.index2.val = self.index2.val, self.index1.val
相关推荐
迷迭香yy31 分钟前
基金档案数据工程实战从收入分析到持仓穿透的Python解析 IG50免费开源股票数据API接口
开发语言·python
其实防守也摸鱼40 分钟前
权限提升与横向移动:从内网渗透到域控的完整技术图谱
运维·服务器·数据库·安全·github·copilot·渗透
清水白石00842 分钟前
Python 类型设计深度解析:TypedDict 能否替代 dataclass?从 JSON 数据边界到 API 设计的最佳实践
java·python·json
人生百态,人生如梦1 小时前
每日论文解读(9.1)——ReToolSQL:面向鲁棒Text-to-SQL的Agentic强化学习与工具增强两阶段训练框架
数据库·sql
DevOpenClub1 小时前
网页采集如何稳定输出结构化数据:JSON、链接与快照三阶段流水线
数据库·json·api
️学习的小王1 小时前
Git项目提交忽略文件怎么做?以Python项目为例,详解.gitignore
git·python·elasticsearch
其实防守也摸鱼1 小时前
免杀与持久化入门:从载荷免杀到隐蔽通道的完整指南
运维·服务器·数据库·安全·github·copilot·渗透
SelectDB1 小时前
统一全文检索与 SQL 分析:Apache Doris 日志分析实践
运维·数据库·掘金技术征文
前端 贾公子1 小时前
第09章:上下文与记忆 (6)
开发语言·前端·python
evans在进步1 小时前
Java 常用设计模式入门:建造者、工厂、单例、外观与代理
java·python·设计模式