知识点
搜索二叉树的父节点大于左孩子节点的值,小于右孩子节点的值。中序遍历搜索二叉树得到的序列为升序序列。
题目
一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回他们的值。保证二叉树中结点的值各不相同。
给定一棵树的根结点,请返回两个调换了位置的值,其中小的值在前。
思路
调换位置后,中序遍历得到的序列一定不是升序序列。下面根据调换位置后二叉树的中序遍历结果得到调换位置的节点值。
如原搜索二叉树中序遍历结果为1 2 3 4 5,如果节点2和5交换,则中序遍历结果变为1 5 3 4 2。可以看到这个序列中有两次降序:第一次为5->3,第二次为4->2. 在这个例子中第一个错误节点是第一次降序中较大的节点(即5),第二个错误节点是第二次降序中较小的节点(即2)。
如果只有一次降序,如将节点3和4交换,中序遍历结果为1 2 4 3 5,可以看到序列中有一次降序4->3,则第一个错误节点是降序中较大的节点(即4),第二个错误节点是降序中较小的节点(即3)。
综合来看,第一个错误节点是第一次降序中的较大节点,第二个错误节点是最后一次降序中的较小节点。
代码实现
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNo