Leetcode 99. Recover Binary Search Tree 恢复二叉搜索树 解题报告

1 解题思想

题目的意思是说,现有一个二叉搜索树(BST),但是呢,这个二叉树有一个错误,其中的两个节点位置出错,只要交换这两个的位置,就可以恢复其正确性。要求不能修改其结构,最好用常数的空间解决。

这道题的注释给了一个很好的提示:使用O(n)可以很直接的解决,为什么,因为我们可以直接中序遍历,找出错误的两个值进行交换就可以了。这就是原始最简单的方式。

那么,如何改进到常数呢?

其实换一个思路想想,就算我们先遍历出来,如何去判别位置错误呢?先序遍历BST出来的肯定是递增的数列,错误的那两个位置是正好破坏前面递增的序列的位置。

那么其实我们可以在遍历的时候,保留上一个位置的值 ,判断当前位置是否出错就可以了。

2 原题

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?

3 AC解

// 欢迎关注新浪微博:@MebiuW
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    TreeNode lastNode = new TreeNode(Integer.MIN_VALUE);
    TreeNode biggerOne = null;
    TreeNode smallerOne = null;
    public void recoverTree(TreeNode root) {
        inorderTraverse(root);
        int tmp = biggerOne.val;
        biggerOne.val = smallerOne.val;
        smallerOne.val = tmp;
    }

    public void inorderTraverse(TreeNode root){
        if(root == null) return ;
        inorderTraverse(root.left);
        // 正确的应该大于
        if(biggerOne == null && root.val <= lastNode.val){
            biggerOne = lastNode;
        }
        if(biggerOne != null && root.val <= lastNode.val){
            smallerOne = root;
        }
        lastNode = root;
        inorderTraverse(root.right);
    }
}

你可能感兴趣的:(leetcode-java)