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);
}
}