这个题解使用中序遍历的方法来恢复二叉搜索树。在中序遍历二叉搜索树时,正常情况下节点值应该是递增的。如果出现节点值减小的情况,说明找到了被错误交换的两个节点。第一个错误节点是第一次发现节点值减小时的前一个节点,第二个错误节点是最后一次发现节点值减小时的当前节点。找到这两个节点后,交换它们的值即可恢复二叉搜索树。
时间复杂度: O(n)
空间复杂度: O(n)
# 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.
"""
lastNode = None # 记录中序遍历的上一个节点
n1 = None # 第一个错误节点
n2 = None # 第二个错误节点
def helper(root):
nonlocal lastNode, n1, n2
if root is None:
return
helper(root.left) # 递归遍历左子树
if lastNode is not None and lastNode.val > root.val: # 如果当前节点值小于上一个节点值
if n1 is None: # 如果是第一次发现错误,记录第一个错误节点
n1 = lastNode
n2 = root # 更新第二个错误节点为当前节点
lastNode = root # 更新上一个节点为当前节点
helper(root.right) # 递归遍历右子树
helper(root) # 中序遍历二叉搜索树
n1.val, n2.val = n2.val, n1.val # 交换两个错误节点的值以恢复二叉搜索树