# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = NoneclassSolution(object):defrecoverTree(self, root):"""
:type root: TreeNode
:rtype: None Do not return anything, modify root in-place instead.
"""
fnode =None
snode =None
pre = TreeNode(float("-inf"))
stack =[]
p = root
while p or stack:while p:
stack.append(p)
p = p.left
p = stack.pop()ifnot fnode and pre.val > p.val:#这是存在异常的情况
fnode = pre #找到第一个位置的异常点if fnode and pre.val > p.val:
snode = p #找到第二个位置的异常点,因为题意说了,只有两个异常,所以无论两者是否挨在一起,只要交换过来值,就一定是对的,此代码不具有泛化性
pre = p
p = p.right
fnode.val,snode.val = snode.val,fnode.val
递归:
# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = NoneclassSolution(object):defrecoverTree(self, root):"""
:type root: TreeNode
:rtype: None Do not return anything, modify root in-place instead.
"""
self.fnode =None
self.snode =None
self.preNode = TreeNode(float("-inf"))deforder(root):ifnot root:return
order(root.left)if self.snode ==Noneand self.preNode.val >= root.val:
self.fnode = self.preNode
if self.fnode and self.preNode.val >= root.val:
self.snode = root
self.preNode = root
order(root.right)
order(root)
self.fnode.val , self.snode.val = self.snode.val , self.fnode.val