99. 恢复二叉搜索树

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


利用中序遍历的性质。

    // 1,4,6,8,9
    // 1,8,6,4,9
    // 由于是顺序的,所以交换之后,第一个值的后一个一定是小于它的,也就是说当前值来说,前一个值大于自己,那么前一个数就是第一个数
    //  对于第二个数来说当前数一定是小于前一个数的。

    TreeNode first = null;
    TreeNode second = null;
    public void recoverTree(TreeNode root) {
        dfs(root);
        swap(first,second);
    }

    public void swap(TreeNode node1, TreeNode node2) {
        if(node1 == null || node2 == null) {
            return;
        }
        int tmp = node1.val;
        node1.val = node2.val;
        node2.val = tmp;
    }

    TreeNode prev = null;
    public void dfs(TreeNode node) {
        if(node == null) {
            return;
        }

        dfs(node.left);
        // 一开是碰到的一定是大值。
        if(prev != null && prev.val > node.val && first == null) {
            first = prev;
        }
        // 如果已经确定了大值,那么此时出现的情况就是小值
        if(prev !=null && prev.val > node.val && first != null) {
            second = node;
        }
        prev = node;
        
        dfs(node.right);
    }

posted @ 2022-02-26 20:46  一颗青菜  阅读(2)  评论(0)    收藏  举报