99. Recover Binary Search Tree
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Example 1:
Input: [1,3,null,null,2]
1
/
3
\
2
Output: [3,1,null,null,2]
3
/
1
\
2
二叉树的中序遍历数组是递增的
所以首先对二叉树进行中序遍历,得到递增数组,如果数组中有不是递增的数对,则将不递增的数对进行交互位置保证数组整体递增即可。
对于不是递增的情况有两种(因为题目中给出仅有两个元素位置错位)。
- 整个数组中只有一对非递增数对:仅将这个数对的两个元素位置对换即可
- 整个数组中有两对非递增数对:例如存在 x i > x i + 1 , x j > x j + 1 x_i > x_{i+1}, x_j > x_{j+1} xi>xi+1,xj>xj+1,只需要对换 x i x_i xi , x j + 1 x_{j+1} xj+1 的位置即可
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public void recoverTree(TreeNode root) {
List<Integer> nums = new ArrayList<>();
inordersearch(root, nums);
int[] change = getchange(nums);
changeTree(root, change);
}
public void inordersearch(TreeNode father, List<Integer> nums){
if(father == null){
return;
}
inordersearch(father.left, nums);
nums.add(father.val);
inordersearch(father.right, nums);
}
public int[] getchange(List<Integer> nums){
int x = -1, y = -1;
for(int i=0; i<nums.size()-1; i++){
if(nums.get(i+1) < nums.get(i)){
y = nums.get(i+1);
if(x == -1){
x = nums.get(i);
}
}
}
return new int[]{x, y};
}
public void changeTree(TreeNode root, int[] change){
if(root == null){
return;
}
if(root.val == change[0]){
root.val = change[1];
}else if(root.val == change[1]){
root.val = change[0];
}
changeTree(root.left, change);
changeTree(root.right, change);
}
}