【leetcode】99. Recover Binary Search Tree【java】简单又容易理解的中序遍历的方法

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?


这个问题似乎很难,但它仅仅是一个简单的中序遍历!

让我们从中序遍历开始入手

private void traverse (TreeNode root) {
   if (root == null)
      return;
   traverse(root.left);
   // Do some business
   traverse(root.right);
}

什么是我们在这里做的business呢?
我们需要找到第一个和第二个不在正确的顺序上的元素

我们如何发现这两个元素呢?例如,我们有如下树,中序遍历并打印为:

6,3,4,5,2

我们比较每个节点与它的下一个,我们可以发现6是第一个需要交换的元素,因为6> 3;2是第二个需要交换的元素,因为2 <5;的第二个元素的第一个元素。

实际上,我们是在比较的是当前节点及其之前的“中序遍历”的节点。

让我们定义三个变量,firstElement,secondElement和prevElement。现在我们只在“do some business”逻辑寻找两个元素。请参见下面的代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    TreeNode firstElement = null;
    TreeNode secondElement = null;
    TreeNode preElement = new TreeNode(Integer.MIN_VALUE);
    public void recoverTree(TreeNode root) {
        traverse(root);
        int tmp = firstElement.val;
        firstElement.val = secondElement.val;
        secondElement.val = tmp;
    }
    public void traverse(TreeNode root){
        if (root == null){
            return;
        }
        traverse(root.left);
        if (firstElement == null && preElement.val >= root.val){
            firstElement = preElement;
        }
        if (firstElement != null && preElement.val >= root.val){
            secondElement = root;
        }
        preElement = root;
        traverse(root.right);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值