题目:
一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回他们的值。保证二叉树中结点的值各不相同。
给定一棵树的根结点,请返回两个调换了位置的值,其中小的值在前。
测试用例:
输入:{3,1,4,null,5,null,2}
输出:[2, 5]
输入:{4,1,3,null,2,null,5}
输出:[3,4]
思路:
其实看测试用例就可以看出来了,两个错误结点在中序遍历输出中相邻或者不相邻,如:中序遍历为 1 2 3 4 5
错误的结点可能为:
1 5 3 4 2
1 2 4 3 5
所以,我们只需要在中序遍历中寻找降序的两个结点。如果这样的结点存在两对,如(5,3), (4,2),说明它们是不相邻的,输出第二对的第二个值和第一对的第一个值;否则就是相邻的,顺序倒一下输出即可。
代码:
class FindErrorNode:
def findError(self, root):
# write code here
st = []
err = []
cur, pre = root, None
while cur or st:
while cur:
st.append(cur)
cur = cur.left
top = st.pop()
if pre and top.val < pre.val:
err.append(pre.val)
err.append(top.val)
pre = top
cur = top.right
if len(err) == 2:
return err[1], err[0]
elif len(err) == 4:
return err[3], err[0]