二叉搜索树中有两个节点的值被相互交换,还原一个正常的二叉搜索树。
二叉搜索树,中序遍历,每次遍历的值都会比上次遍历的值小。根据中序遍历的这个性质可以找到值错误的节点,用first表示上一次遍历的节点,用second表示当前遍历的节点,但是我们不能确定到底哪一个才是错误的节点,继续遍历,如果接下来没有发现错误的节点,则交换上次发现的两个错误节点即可。如果接下来又发现了错误的节点,则说明现在遍历的节点和first节点是错误节点,交换两个节点的值。代码如下:
public void recoverTree(TreeNode root) {
//use inorder traversal to detect incorrect node
inOrder(root);
int temp = first.val;
first.val = second.val;
second.val = temp;
}
TreeNode prev = null;
TreeNode first = null;
TreeNode second = null;
public void inOrder(TreeNode r