leetcode 99. 恢复二叉搜索树(dfs,遍历)

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

进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?

 

示例 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 使二叉搜索树有效。
  • 解题思路—dfs+递归

二叉搜索树的中序遍历结果一定是一个从小到大递增的数组,那么我们则可以用中序遍历找到数组中这两个异常值点x,y。

 对这颗二叉树中序遍历,我们用pre节点始终保存二叉树的根节点,然后判断上一个根节点是否大于下一个根节点,如果大于则保存为y节点,然后把上一个根节点保存为x节点。遍历完成后,如果x和y都不是空的话,说明这颗二叉搜索树存在乱序,进行交换即可。

这道题我觉得可以看下题解:https://leetcode-cn.com/problems/recover-binary-search-tree/solution/san-chong-jie-fa-xiang-xi-tu-jie-99-hui-fu-er-cha-/

# 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: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        self.x = None 
        self.y = None
        self.pre = None


        def dfs(root):
            if not root:
                return
            dfs(root.left)
            if not self.pre:
                self.pre = root
            else:
                if self.pre.val > root.val:
                    self.y = root
                    if not self.x:
                        self.x = self.pre 
                self.pre = root
            dfs(root.right)
        dfs(root)
        if self.x and self.y:
            self.x.val, self.y.val = self.y.val, self.x.val
        return root

                    

  

原文地址:https://www.cnblogs.com/yeshengCqupt/p/13924922.html