描述
二叉搜索树(BST)中的两个节点的值被错误地交换了,
请在不改变树的结构的情况下恢复这棵树。
备注;
用O(n)的空间解决这个问题的方法太暴力了,你能设计一个常数级空间复杂度的算法么?
示例 1:
输入: [1,3,null,null,2]
1 / 3 \ 2
输出: [3,1,null,null,2]
3 / 1 \ 2
import java.util.*;
public class Solution {
public void recoverTree(TreeNode root) {
List<TreeNode> list = new ArrayList<>();
inorder(root, list);
TreeNode first = null, second = null;
for (int i = 0; i < list.size() - 1; i ++) {
if(list.get(i).val > list.get(i + 1).val) {
first = list.get(i);
break;
}
}
for (int i = list.size() - 1; i > 0; i --) {
if(list.get(i).val < list.get(i - 1).val) {
second = list.get(i);
break;
}
}
first.val = second.val ^ first.val ^ (second.val = first.val);
}
public static void inorder(TreeNode root, List<TreeNode> list) {
if(root != null) {
inorder(root.left, list);
list.add(root);
inorder(root.right, list);
}
}
}