99. 恢复二叉搜索树

问题描述

https://leetcode.cn/problems/recover-binary-search-tree/description/

解题思路

二叉搜索树的中序遍历一定是一个有序的序列。

题目中说两个节点的值被交换了,即我们中序遍历得到的二叉搜索树是无序的,但交换两个节点即为有序。

所以,我们可以:

  1. 深度优先搜索,搞到二叉搜索树的序列。
  2. 将这个序列排序,再次遍历,找到需要交换值的节点。
  3. 将值进行交换。

代码

复制代码
# Definition for a binary tree node.
# 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.
        """
        li = []
        def dfs(root):
            if not root:
                return
            dfs(root.left)
            li.append((root.val, root))
            dfs(root.right)
        dfs(root)
        li_sort = sorted(li, key=lambda x: x[0])
        swaped = []
        for i in range(len(li)):
            if li[i][0] != li_sort[i][0]:
                swaped.append(li[i][1])
        x, y = swaped
        x.val, y.val = y.val, x.val
复制代码

 2024二刷:

复制代码
# Definition for a binary tree node.
# 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.
        """
        mem = []
        vals = []
        def dfs(root):
            if root:
                dfs(root.left)
                mem.append(root)
                vals.append(root.val)
                dfs(root.right)
        dfs(root)
        vals.sort()
        for i in range(len(mem)):
            mem[i].val = vals[i]
复制代码

 

posted @   BJFU-VTH  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示