Recover Binary Search Tree
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?
分析:http://www.cnblogs.com/yuzhangcmu/p/4208319.html
具体的思路,还是通过中序遍历,只不过,不需要存储每个节点,只需要存一个前驱即可。
例如1,4,3,2,5,6
1.当我们读到4的时候,发现是正序的,不做处理
2.但是遇到3时,发现逆序,将4存为第一个错误节点,3存为第二个错误节点
3.继续往后,发现3,2又是逆序了,那么将第2个错误节点更新为2
如果是这样的序列:1,4,3,5,6同上,得到逆序的两个节点为4和3。
========================================
这里我们补充一下,为什么要替换第二个节点而不是第一个节点:
e.g. The correct BST is below:
 
The inorder traversal is :  1 3 4 6 7 8 10 13 14
Find the place which the order is wrong.
        Wrong order: 1 3 8 6 7 4 10 13 14     
        FIND:                    8 6
        Then we find:             7 4
        8, 6 是错误的序列, 但是,7,4也是错误的序列。
        因为8,6前面的序列是正确的,所以8,6一定是后面的序列交换来的。
        而后面的是比较大的数字,也就是说8一定是被交换过来的。而7,4
        中也应该是小的数字4是前面交换过来的。
用反证法来证明:
        假设:6是后面交换过来的
        推论: 那么8比6还大,那么8应该也是后面交换来的,
        这样起码有3个错误的数字了
        而题目是2个错误的数字,得证,只应该是8是交换过来的。
结论就是:我们需要交换的是:8, 4.
 public class Solution {
     TreeNode pre = null, first = null,second = null;
     public void recoverTree(TreeNode root) {
         inOrder(root);
         int tmp = first.val;
         first.val = second.val;
         second.val = tmp;
     }
     public void inOrder(TreeNode root) {
         if (root == null) return;
         inOrder(root.left);
         if (pre != null && pre.val > root.val) {
             if (first == null) {
                 first = pre;
                 second = root;
             } else {
                 second = root;
             }
         }
         pre = root;
         inOrder(root.right);
     }
 }
Recover Binary Search Tree的更多相关文章
- Leetcode 笔记 99 - Recover Binary Search Tree
		
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
 - 【leetcode】Recover Binary Search Tree
		
Recover Binary Search Tree Two elements of a binary search tree (BST) are swapped by mistake. Recove ...
 - 39. Recover Binary Search Tree  &&  Validate Binary Search Tree
		
Recover Binary Search Tree OJ: https://oj.leetcode.com/problems/recover-binary-search-tree/ Two elem ...
 - 【LeetCode练习题】Recover Binary Search Tree
		
Recover Binary Search Tree Two elements of a binary search tree (BST) are swapped by mistake. Recove ...
 - LeetCode: Recover Binary Search Tree  解题报告
		
Recover Binary Search Tree Two elements of a binary search tree (BST) are swapped by mistake. Recove ...
 - [LeetCode] 99. Recover Binary Search Tree(复原BST) ☆☆☆☆☆
		
Recover Binary Search Tree leetcode java https://leetcode.com/problems/recover-binary-search-tree/di ...
 - [线索二叉树] [LeetCode] 不需要栈或者别的辅助空间,完成二叉树的中序遍历。题:Recover Binary Search Tree,Binary Tree Inorder Traversal
		
既上篇关于二叉搜索树的文章后,这篇文章介绍一种针对二叉树的新的中序遍历方式,它的特点是不需要递归或者使用栈,而是纯粹使用循环的方式,完成中序遍历. 线索二叉树介绍 首先我们引入“线索二叉树”的概念: ...
 - 【LeetCode】99. Recover Binary Search Tree
		
Recover Binary Search Tree Two elements of a binary search tree (BST) are swapped by mistake. Recove ...
 - 【LeetCode】99. Recover Binary Search Tree 解题报告(Python)
		
[LeetCode]99. Recover Binary Search Tree 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/p ...
 - [LeetCode] Recover Binary Search Tree 复原二叉搜索树
		
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...
 
随机推荐
- jexus jws 安装
			
cd /tmp wget linuxdot.net/down/jexus--x64.tar.gz tar -zxvf jexus--x64.tar.gz mv jexus /usr rm -rf /t ...
 - Code First 迁移
			
https://msdn.microsoft.com/zh-cn/data/jj591621 Data Access and Storage > 学习 > Entity Framework ...
 - 常用JS效果 不断进步贴 不停更新~ 纪念用~
			
常用效果 JS 都是Jquery 没有特殊说明 1.选项卡 用的JQuery 以后学好点再来对比 看下 /* * @parent 最外层父级元素 * @EventElement 触发事件元素 ...
 - Python之路【第四篇补充】:面向对象初识和总结回顾
			
面向过程的编程 面向过程:根据业务逻辑从上到下写垒代码! 例子: 需求一.有一个程序需要做身份认证: 用户名有个字典: #定义一个用户名信息字典 user_info = { "zhangsa ...
 - 转载:Objective-C中的 instancetype 和 id 关键字
			
Objective-C中的instancetype和id关键字 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/16994 ...
 - JavaScript正则表达式方法总结
			
str.match(reg) 1.reg没有全局标志g,match将只执行一次匹配.匹配成功返回一个数组,arr = [$0,$1,$2,...,index,str],匹配失败返回null. arr中 ...
 - Hello World(本博客启程篇)
			
Hello World 作为本博客第一篇日志,作为程序员,无论走到哪里,做什么事,必须先输出这句话. 一个想法 从今天3月份到现在一直在学技术,过程中坑的解决.知识的总结以及想法等都写到了" ...
 - css使 同一行内的 文字和图片 垂直居中对齐?
			
设置父容器, 使 父容器 div 下的所有元素 都 垂直对齐: father-container *{ vertical-align:middle 找回密码
 - poj3070 Fibonacci
			
Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. F ...
 - HttpClient连接池的连接保持、超时和失效机制
			
HTTP是一种无连接的事务协议,底层使用的还是TCP,连接池复用的就是TCP连接,目的就是在一个TCP连接上进行多次的HTTP请求从而提高性能.每次HTTP请求结束的时候,HttpClient会判断连 ...