【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);
}
}
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);
}
}
相关文章推荐
- spring注入static变量
- java基础知识点
- Java类加载过程
- eclipse配色方案
- jdk环境变量配置
- 搭建一个开发Predix软件的Windows系统(4)配置Java开发环境
- Java基础学习笔记
- java 解析json字符串
- 5.《深入理解Java虚拟机》垃圾收集算法思想
- java student类的注意点 嵌套类
- spring mvc4使用及json 日期转换解决方案
- 用Java发送邮件 smtp验证码问题
- Spring Boot整合Spring MVC
- Leetcode-475. Heaters
- 4.《深入理解Java虚拟机》对象是否可回收?
- POJ 1205 Water Treatment Plants JAVA高精度+DP *
- Java IO流学习总结
- 7 -- Spring的基本用法 -- 5... Spring容器中的Bean;容器中Bean的作用域;配置依赖;
- Spring mvc 中的一些注解 (1)
- Java基础知识总结之一