恢复二叉搜索树

给你二叉搜索树的根节点 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
相关推荐
花酒锄作田5 小时前
Pydantic校验配置文件
python
hboot5 小时前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络
GBASE10 小时前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
CSharp精选营10 小时前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
ZhengEnCi16 小时前
P2M-Matplotlib折线图完全指南-从数据可视化到趋势分析的Python绘图利器
python·matlab·数据可视化
ZhengEnCi17 小时前
P2L-Matplotlib饼图完全指南-从数据可视化到图表定制的Python绘图利器
python·matlab
曲幽17 小时前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry
用户83580861879118 小时前
基于 Self-RAG 与列表级重排序的进阶 RAG 系统设计与实现
python
xiezhr20 小时前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode