您的位置:首页 > 编程语言 > Java开发

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

2017-01-01 20:21 597 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: