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 恢复二叉搜索树 解题报告的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 99. Recover Binary Search Tree

Leetcode 99. Recover Binary Search Tree

LeetCode OJ 99. Recover Binary Search Tree

leetcode 99 Recover Binary Search Tree ----- java

[LeetCode] 99. Recover Binary Search Tree Java

LeetCode-99-Recover Binary Search Tree