99. Recover Binary Search Tree(恢复二叉搜索树)

题目链接: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时就可以确定了的。

后续只需不断更新需要互换的第二个元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值