首先,搜索二叉树,中序遍历有序
通过观察示例可以发现,错误有两种情况:子节点之间互换,子节点和直接父节点之间互换。
第一种情况,直接找到 找到两个比其后元素大的,第一个取大的,第二个取小的
关于第二种情况,注意此时中序遍历后数据大小关系是:大小大或者小大小,这样的话,补充result[0]为当前节点即可
所以为了兼容,直接取result[0]为当前,result[1]为较大的前驱。
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类 the root
* @return int整型一维数组
*/
private int[] result;
private TreeNode pre = null;
public int[] findError (TreeNode root) {
//
// 结束条件:全部找到或者到达null,返回
// 单层逻辑:
if (root == null) {
return new int[0];
}
result = new int[2];
result[0] = 0;
result[1] = 0;
findTwoError(root);
// Arrays.sort(result);
return result;
}
private void findTwoError(TreeNode root) {
if (root == null) {
return;
}
findTwoError(root.left);
if (pre != null && pre.val > root.val) {
if (result[1] > 0) {
result[0] = root.val;
} else {
result[1] = pre.val;
result[0] = root.val;
}
}
pre = root;
findTwoError(root.right);
}
}

京公网安备 11010502036488号