题目描述
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 1:
示例 2:
代码
package pid99;
import java.util.List;
import java.util.ArrayList;
public class Solution {
public void recoverTree(TreeNode root){
if(root == null){
return;
}
List<Integer> nodeList = new ArrayList<>();
inorder(root.left,nodeList);
nodeList.add(root.val);
inorder(root.right,nodeList);
int[] twoNums = findTwoFaultyNums(nodeList);
int first = twoNums[0];
int second = twoNums[1];
recover(first,second,root);
}
public void inorder(TreeNode root,List<Integer> nodeList){
if(root == null){
return;
}
inorder(root.left,nodeList);
nodeList.add(root.val);
inorder(root.right,nodeList);
}
public int[] findTwoFaultyNums(List<Integer> nodeList){
int first = -1;
int second = -1;
for(int i=0;i<nodeList.size()-1;i++){
if(nodeList.get(i) > nodeList.get(i+1)){
second = nodeList.get(i+1);
if(first == -1){
first = nodeList.get(i);
}else{
break;
}
}
}
return new int[]{first,second};
}
public void recover(int first,int second,TreeNode root){
if(root == null){
return;
}
if(root.val == first){
root.val = second;
}else if(root.val == second){
root.val = first;
}
recover(first,second,root.left);
recover(first,second,root.right);
}
}
性能表现
心得
今天花了很长时间解出来的一道Hard题,第一遍基本已经做出来了,不过对于交换结点纠结了半天,其实只需要将两个位置上结点的val值交换即可,我想复杂了。
看了遍题解,和我的思路基本一致,不过我自己的代码已经删掉了,所以只能重写。
重写过程中也参考了题解比较优秀的一些处理,比如将nodeList作为参数传入以进行递归,而不是声明为类的成员变量;那个recover递归函数思路很巧妙,所以也搬运过来了。