题意分析:

  • 在做这道题之前,最好是先了解什么是搜索二叉树(BST)
    • 左子树的值小于根节点
    • 右子树的值大于根节点
    • 子树同样满足上述规则

BST:

图片说明

  • 可以参考图解示例:

图片说明

解法一:递归

  • 因为二叉搜索树的中序遍历是正序数组,所以直接进行中序遍历,遍历的过程中直接找出异常值分析结果可得。
  • 必然是一个较大的异常值交换到了前面,较小的异常值数放到了后面, 所以遍历的过程中出现的第一个当前值小于前一个值的情况时。
  • 前一个值即为要找的较大的异常值,而出现的最后一个 当前值小于前一个值的情况时,当前值才是我们要找的较小的异常值,所以在遍历过程中需要覆盖前面所求的较小值。

Java参考代码:

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整型一维数组
     */

      //存储结果集的二维数组
    int[] result = new int[2];
    int index = 1;
    TreeNode preNode;
    public int[] findError (TreeNode root) {
        // 特判
        if(root == null) {
            return result;
        }
        // 递归左子树,寻找该树符合条件的节点
        findError(root.left);
        if(preNode == null) {
            preNode = root;
        }
        // 判断是否是出错的节点
        if(index == 1 && root.val < preNode.val) {
            result[index] = preNode.val;
            index--;
        }
        if(index == 0 && root.val < preNode.val) {
            res