def recoverTree(self, root):
nodes = []
# 中序遍历二叉树,并将遍历的结果保存到list中
def dfs(root):
if not root:
return
dfs(root.left)
nodes.append(root)
dfs(root.right)
dfs(root)
x = None
y = None
pre = nodes[0]
# 扫面遍历的结果,找出可能存在错误交换的节点x和y
for i in range(1,len(nodes)):
if pre.val>nodes[i].val:
y=nodes[i]
if not x:
x = pre
pre = nodes[i]
# 如果x和y不为空,则交换这两个节点值,恢复二叉搜索树
if x and y:
x.val,y.val = y.val,x.val
不使用辅助数组,根据二叉搜索树的性质中序遍历是有序的,用pre记录前一个节点的值。第一次乱序肯定是self.pre>root, self.pre是大数不应该放在这前面记录self.pre,第二次乱序也定是self.pre>root,self.root是个小数不应该放后面,记录self.root。交换这两个值
def recoverTree(self, root):
"""
:type root: TreeNode
:rtype: 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 self.pre:
if self.pre.val > root.val: #前面的大于后面的说明找到乱序了
self.y = root #记录第二次乱序的数,第二次乱序也定是self.pre>root,self.root是个小数不应该放后面
if not self.x: #记录第一次乱序的数,第一次乱序肯定是self.pre>root,self.pre是大数不应该放在这前面
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