99. 恢复二叉搜索树

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
利用中序遍历的性质。
// 1,4,6,8,9
// 1,8,6,4,9
// 由于是顺序的,所以交换之后,第一个值的后一个一定是小于它的,也就是说当前值来说,前一个值大于自己,那么前一个数就是第一个数
// 对于第二个数来说当前数一定是小于前一个数的。
TreeNode first = null;
TreeNode second = null;
public void recoverTree(TreeNode root) {
dfs(root);
swap(first,second);
}
public void swap(TreeNode node1, TreeNode node2) {
if(node1 == null || node2 == null) {
return;
}
int tmp = node1.val;
node1.val = node2.val;
node2.val = tmp;
}
TreeNode prev = null;
public void dfs(TreeNode node) {
if(node == null) {
return;
}
dfs(node.left);
// 一开是碰到的一定是大值。
if(prev != null && prev.val > node.val && first == null) {
first = prev;
}
// 如果已经确定了大值,那么此时出现的情况就是小值
if(prev !=null && prev.val > node.val && first != null) {
second = node;
}
prev = node;
dfs(node.right);
}
浙公网安备 33010602011771号