题目:一颗二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这颗二叉树不再是搜索二叉树,请找到两个错误节点并返回。已知二叉树中所有节点的值都不一样,给定二叉树的头节点head,返回一个长度为2的二叉树节点类型的数组errs,errs[0]表示一个错误节点,errs[1]表示另一个错误节点。
思路:寻找两个错误节点的过程可以总结为:第一个错误节点为第一次降序时较大的节点,第二个错误节点为最后一次降序时较小的节点
def getTwoErrNode(head):
errs = [None for i in range(2)]
if head == None:
return errs
stack = []
pre = None
while len(stack)!=0 or head!=None:
if head!=None:
stack.append(head)
head = head.left
else:
head = stack.pop()
if pre !=None and pre.value > head.value:
if errs[0] == None:
errs[0] = pre
errs[1] = head
pre = head
head = head.right
return errs
进阶问题:如果在原问题中得到了这两个错误节点,我们当然可以通过交换两个节点的节点值的方式让整颗二叉树重新称为搜索二叉树。但现在要求你不能这么做,而是在结构上完全交换两个节点的位置。请实现调整的函数。