题目:
二叉搜索树BST中有两个结点的值互相放错了位置,找出并交换它们。
思路:若依据BST性质,使用ArrayList存储其中序遍历,可以很方便的找出题目要求的两个值,但是空间复杂度为O(n)。
这里有两种情况需要注意:
1.两个放错位置的结点相邻,如 中序遍历为:1,2,4,3,5. 则pre.val>cur.val的情况只发生了一次;
2.两个结点不相邻,如 1,4,3,2,5. 则pre.val>cur.val的情况发生了两次。
一个很精妙的方法如下:
public class Solution {
private TreeNode first=null;//first和second存放需要交换的两个结点。
private TreeNode second=null;
private TreeNode pre=null;//pre存放中序遍历的上一个结点.
public void recoverTree(TreeNode root) {
if(root == null)
return;
inOrder(root);
if(first!=null&&second!=null)
{
int temp=first.val;
first.val=second.val;
second.val=temp;
}
}
public void inOrder(TreeNode root)
{
if(root.left!=null)
inOrder(root.left);
if(pre!=null&&pre.val>root.val)//若pre.val>root.val只发生了一次,first和second存放该相邻两结点
{ //若pre.val>root.val发生两次,second存放第二个结点。
if(first == null)
{
first=pre;
}
second=root;
}
pre=root;
if(root.right!=null)
inOrder(root.right);
}