题解 | #找到搜索二叉树中两个错误的节点#

找到搜索二叉树中两个错误的节点

https://www.nowcoder.com/practice/4582efa5ffe949cc80c136eeb78795d6

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
    * 上一次中序遍历过的节点
    */
    private TreeNode prev;
    /**
     * 第一个错误节点
     */
    private TreeNode first;
    /**
     * 第二个错误节点
     */
    private TreeNode second;

    // 查找树节点逆序对--中间过程操作
    private void find(TreeNode node) {
        // 出现了逆序对,出现逆序对可能性有两种:
        // 第一种两个节点中序遍历中节点挨着,另外一种不挨着,无论哪种,第一个遇到的逆序对第一个节点就是错误值,遇到第二个逆序对的第二个值就是错误值
        if (prev != null && prev.val > node.val) {
            // 第2个错误节点:最后一个逆序对中较小的那个节点
            second = node;

            // 第1个错误节点:第一个逆序对中较大的那个节点
            if (first != null) return;
            first = prev;
        }
        prev = node;
    }
    /**
     *
     * @param root TreeNode类 the root
     * @return int整型一维数组
     */
    public int[] findError (TreeNode root) {
        // write code here
        findWrongNodes(root);
        // 交换2个错误节点的值
        int tmp = first.val;
        first.val = second.val;
        second.val = tmp;
        return new int[]{first.val,second.val};
    }
    private void findWrongNodes(TreeNode root) {
        if (root == null) return;
        findWrongNodes(root.left);
        find(root);
        findWrongNodes(root.right);
    }

}

解题思想:

* 方式一:递归中序遍历查找逆序对

* 方式二:morris遍历:线索二叉搜索树找逆序对

#算法##算法笔记#
全部评论

相关推荐

Aaso:挺好的,早挂早超生
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务