二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 1:
输入: [1,3,null,null,2]
1
/
3
\
2
输出: [3,1,null,null,2]
3
/
1
\
2
示例 2:
输入: [3,1,4,null,null,2]
3
/ \
1 4
/
2
输出: [2,1,4,null,null,3]
2
/ \
1 4
/
3
进阶:
使用 O(n) 空间复杂度的解法很容易实现。
你能想出一个只使用常数空间的解决方案吗?
思路
对于二次搜索树,如果进行中序遍历会形成一个从小到大的递增序列,可以储存中序遍历的结果,检测到数列中不符合要求的节点(因为是两个节点值交换,第一个错误节点会比下一个节点的值还大,第二个错误节点的值会比上一个节点的值还小,找到这两个节点,将其值交换)
def recoverTree(self, root):
self.t1=None
self.t2=None
self.m=TreeNode(-9999999)
'''
通过m遍历而二叉树,第一次检测到错误节点,即下一个节点比m小时,表示m为错误节点,第二次检测到错误节点,即下一个节点比m小,表示下一个节点为错误节点,
'''
self.help(root)
self.t1.val,self.t2.val=self.t2.val,self.t1.val
def help(self,root):
if root==None:return
self.help(root.left)
if self.t1==None and self.m.val>=root.val:self.t1=self.m#第一个错误值比下一个节点的值还大
if self.t1!=None and self.m.val>=root.val: self.t2=root
self.m=root
self.help(root.right)