链接:https://leetcode-cn.com/problems/recover-binary-search-tree
arr[0] = 1
arr[0] = 4 node.val (3) < arr[0].val(4) 进入if (not arr[1]:)循环 arr[1] = 4 , arr[2] = 3
arr[0] = 3 node.val (2) < arr[0].val(3) 不满足if (not arr[1]:)循环 , arr[2] = 2
所以是 arr[1] = 4 , arr[2] = 2 交换
方法一:递归 + 中序遍历
编程实现要点:
# 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.
"""
arr = [None, None, None]
def dfs(node):
if not node:
return
# 典型中序遍历
dfs(node.left)
if arr[0] and node.val < arr[0].val:
# 全1才过node.val < arr[0].val,(本节点 < 前一个节点)违背二叉搜索树才会进入
if not arr[1]: # arr[1] 为 False则进入
arr[1] = arr[0] # 确定第一元素
arr[2] = node # 确定第二元素
arr[0] = node # prev随遍历向后移动
dfs(node.right)
dfs(root)
arr[1].val, arr[2].val = arr[2].val, arr[1].val