二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 1:
输入: [1,3,null,null,2]
1
/
3
2
输出: [3,1,null,null,2]
3
/
1
2
使用 O(n) 空间复杂度的解法很容易实现。
你能想出一个只使用常数空间的解决方案吗?
class Solution {
public void recoverTree(TreeNode root) {
List<Integer> list = new ArrayList<>();
TreeNode node = root;
dfs(node, list);
//System.out.println(list);
int pre = list.get(0);
int f = -1, s = -1;
for (int i = 1; i < list.size(); i++) {
int val = list.get(i);
//System.out.println(val + " " + pre + " " + f + " " + s);
if (pre > val && f == -1) {
f = pre;
}
if (f != -1 && pre > val) {
s = val;
}
pre = val;
}
//System.out.println(f + " " + s);
dfsModify(root, f, s);
}
void dfsModify(TreeNode root, int f, int s) {
if (root == null) {
return;
}
if (root.val == f) {
root.val = s;
} else if (root.val == s) {
root.val = f;
}
dfsModify(root.left, f, s);
dfsModify(root.right, f, s);
}
void dfs(TreeNode root, List<Integer> list) {
if (root == null) {
return;
}
dfs(root.left, list);
list.add(root.val);
dfs(root.right, list);
}
}