一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回他们的值。保证二叉树中结点的值各不相同。给定一棵树的根结点,请返回两个调换了位置的值,其中小的值在前。
分析:可以进行中序遍历,那么数值就是升序,所以如果产生一次降序,那么第一个错误节点就是较大的数,第二个错误节点就是较小的数,两次降序的话,第一个错误节点就是前一次降序较大的值,第二个错误节点就是第二次降序较小的值。
public class FindErrorNode {
public int[] findError(TreeNode root) {
// write code here
List<Integer> list=new ArrayList<>();
inOrder(root,list);
int[] res=new int[2];
//降序次数
int count=0;
//其中较大的数
int missMax=-1;
for(int i=0;i<list.size()-1;i++){
if(list.get(i)>list.get(i+1)){
count++;
//较小的数
res[0]=list.get(i+1);
//一次降序
if(count==1){
//较大的数
res[1]=list.get(i);
//可能有两次降序,所以存起来以后判断
missMax=list.get(i);
//两次降序
}else{
//较大的数是上一次降序较大的数
res[1]=missMax;
}
}
}
return res;
}
//中序遍历
public void inOrder(TreeNode head,List<Integer> list){
if(head==null){
return;
}
inOrder(head.left,list);
list.add(head.val);
inOrder(head.right,list);
}
}