恢复二叉搜索树

给你二叉搜索树的根节点 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
相关推荐
nanawinona10 分钟前
2026年下半年量化学习,不同基础要查不同缺口
人工智能·python
麦聪聊数据18 分钟前
企业数据市场建设(三):API 化服务封装,让数据开箱即用、避免重复开发
数据库
脱胎换骨-军哥22 分钟前
C++数据库存储引擎内核开发:B+树索引与MVCC并发控制的完整实现
数据库·c++·b树
zephyr0523 分钟前
数据结构-并查集
数据结构
CTA量化套保26 分钟前
最新量化表达入门,从概念规则到简单实现
人工智能·python
麦聪聊数据30 分钟前
企业数据市场建设(四):流程闭环与价值运营,让数据市场真正转起来
运维·数据库
正儿八经的少年37 分钟前
redis 的大 key 和热 key 详解
数据库·redis·缓存
AI砖家40 分钟前
多智能体系统实战:架构设计、数据库表设计与 Skill 体系
数据库·多智能体·skill·agent架构设计·agengt
稚南城才子,乌衣巷风流1 小时前
动态树(Dynamic Tree)数据结构详解
数据结构·算法
吃饱了得干活1 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain