4.3. Hard

99. Recover Binary Search Tree

99. Recover Binary Search Tree

class Solution:
    def recoverTree(self, root: TreeNode) -> None:
        """
        二叉搜索树的中序遍历(元素有递增的)
        test case inOrder: [3, 2, 1]
        正常BST: [1, 2, 3]
        这里我们有个规律发现这两个节点:
        第一个节点,是第一个按照中序遍历时候前一个节点大于后一个节点,我们选取前一个节点,这里指节点3;
        第二个节点,是在第一个节点找到之后,后面出现前一个节点大于后一个节点,我们选择后一个节点,这里指节点1;
        """
        self.prev = TreeNode(float('-inf'))
        self.first, self.second = None, None
        self.inorder(root)
        self.first.val, self.second.val = self.second.val, self.first.val

    def inorder(self, root):
        if not root:
            return
        self.inorder(root.left)
        if not self.first and self.prev.val > root.val:
            self.first, self.second = self.prev, root
        if self.first and self.prev.val > root.val:
            self.second = root
        self.prev = root
        self.inorder(root.right)