恢复二叉搜索树

给你二叉搜索树的根节点 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
相关推荐
高洁011 小时前
从GPT到开源大模型
python·机器学习·数据挖掘·transformer·知识图谱
吴梓穆1 小时前
Python 基础语法2 if 运算符 循环
android·开发语言·python
如竟没有火炬1 小时前
整数拆分——动态规划
开发语言·数据结构·python·算法·leetcode·动态规划
星川皆无恙1 小时前
基于BERT+LSTM+CRF与知识图谱的医疗智能问答系统实战:Neo4j图数据库+实体识别+意图分析完整项目
数据库·人工智能·深度学习·bert·lstm·知识图谱·neo4j
叫我:松哥1 小时前
基于数据挖掘的旅游景点个性化推荐系统设计与实现,Apriori和FP-Growth算法挖掘景点之间的关联规则
人工智能·python·算法·数据挖掘·数据分析·beautifulsoup
极光代码工作室1 小时前
基于机器学习的客户分类系统设计
人工智能·python·深度学习·机器学习
copyer_xyf1 小时前
FastAPI 核心语法
后端·python
Upsy-Daisy1 小时前
Hermes Agent 学习笔记 03:CLI 与 TUI 使用体验,让 Agent 真正进入终端工作流
服务器·前端·数据库
SilentSamsara2 小时前
scikit-learn 工作流工程化:Pipeline、ColumnTransformer 与自定义转换器
开发语言·人工智能·python·机器学习·青少年编程·numpy·scikit-learn