题目链接:https://leetcode.com/problems/recover-binary-search-tree/
思路:
看到二叉搜索树时,我想到的是中序遍历符合从大到小的原则。
然后根据中序遍历这一特性找到哪两个节点需要交换。
最初写的时候踩得一个小坑:
Input: [1,3,null,null,2] 1 / 3 \ 2 Output: [3,1,null,null,2] 3 / 1 \ 2
中序遍历输入为3 2 1;
按照正常思维,只需判断出前一个大于当前节点就可以确定两个元素了。
但是上面的例子,由于3和1的交换,导致先遍历的2也大于当前的1,
所以在第一次出现反常条件时,仅仅能确定first元素对应的节点,second节点则需要持续更新。
直到不再出现prev.val>current.val。
AC 22ms 98% Java:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
TreeNode prev=null;
TreeNode first=null;
TreeNode second=null;
public void recoverTree(TreeNode root) {
helper(root);
int temp=first.val;
first.val=second.val;
second.val=temp;
}
public void helper(TreeNode root){
if(root==null)
return;
helper(root.left);
if(prev!=null){
if(first==null&&prev.val>root.val)
first=prev;
if(first!=null&&prev.val>root.val)
second=root;
}
prev=root;
helper(root.right);
}
}
helper方法部分不能写成:
if(prev!=null){
if(prev.val>root.val){
first=prev;
second=root;
}
}
因为第一个需要互换的节点是在第一次出现prev.val>root.val时就可以确定了的。
后续只需不断更新需要互换的第二个元素。