题目的意思是二分查找树中有两个点的位置出现错误,找到并调整过来。 对于BST,很重要的特征就是中序遍历是从小到大排列的。 那么中序遍历一遍BST,找到小于前一节点的节点即为出错的位置。
但是有两种可能的出错方式:
1. 左子结点大于根节点小于右子结点或根节点大于右子结点大于左子结点。 这种情况下找到的当前节点和前一节点就是出错的两个节点
2. 左子结点大于根节点大于右子结点。这时需要交换左右子节点的位置,在中序遍历的序列中有两组点出现问题。
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
TreeNode pre=null,p1=null,p2=null;
public void recoverTree(TreeNode root) {
if( root == null )
{
return ;
}
fun( root );
int tmp = p1.val;
p1.val = p2.val;
p2.val = tmp;
}
void fun( TreeNode root )
{
if( root == null )
{
return ;
}
fun( root.left );
if( pre != null && pre.val > root.val )
{
if( p1 == null )
{
p1 = pre;
p2 = root;
}
else
{
p2 = root;
}
}
pre = root;
fun( root.right );
}
}