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

Posted 学术状态抽奖器

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 99. Recover Binary Search Tree 恢复二叉搜索树 解题报告的主要内容,如果未能解决你的问题,请参考以下文章