问题
解答
迭代中序遍历算法
由题知两个节点被错误的交换了,可借助力扣第94题中序遍历的迭代算法遍历。如果当前节点root
的值小于前置节点p
的值,p
是错误节点,持续迭代到最后一个出现的小于pred
的root
为第二个错误节点。确定了两个错误节点后就可退出循环并交换其值,问题就得到了解决。
时间复杂度: O(n)
class Solution:
def recoverTree(self, root: TreeNode):
stack = []
wrong1 = wrong2 = p = None
while stack or root:
while root:
stack.append(root)
root = root.left
root = stack.pop()
if p and root.val < p.val:
wrong2 = root
#有两个错误节点就退出循环
if wrong1 is None:
wrong1 = p
else:
break
p = root
root = root.right
wrong1.val, wrong2.val = wrong2.val, wrong1.val
调试结果: