【1】【leetcode-99】 恢复二叉搜索树
(没思路)
99. 恢复二叉搜索树
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 1:
输入: [1,3,null,null,2] 1
/
3
\
2 输出: [3,1,null,null,2] 3
/
1
\
2
示例 2:
输入: [3,1,4,null,null,2] 3
/ \
1 4
/
2 输出: [2,1,4,null,null,3] 2
/ \
1 4
/
3
进阶:
- 使用 O(n) 空间复杂度的解法很容易实现。
- 你能想出一个只使用常数空间的解决方案吗?
中序遍历,正常情况下为升序排列,结果中如果有一个降序对,说明该两个node需交换;若有两个降序对,说明第一对的前一个node和第二对的后一个node需要交换。
所谓简单的O(n)个空间的思路:
中序遍历得到数组,比如[1,3,2,4],在用一个hashmap<int,TreeNode>保存对象.
然后对数组排序,得到[1,2,3,4],对比得到2和3两个节点不一样,交换一下值即可。
下面实现进阶的常数空间思想:
在纸上写几个数组观察一下,可以发现,只需要找到三个结点(prev_first,first,second),就能进行交换,且只交换值是最方便的。
中序遍历,寻找第一个递减的节点,用prev记录前一个节点。
prev_first记录frist前驱,first记录现在。
再次寻找第二个递减的节点,second记录。若是找到了second,交换prev_first和second,若是没找到,交换prev_first和first
链接:https://www.nowcoder.com/questionTerminal/67c7172122b54b748e78eac7b183b5f3
来源:牛客网 public class Solution {
private TreeNode firstErrorNode=null;
private TreeNode secondErrorNode=null;
private TreeNode lastNode=null;
public void recoverTree(TreeNode root){
dealCore(root);
int temp=secondErrorNode.val;
secondErrorNode.val=firstErrorNode.val;
firstErrorNode.val=temp;
}
private void dealCore(TreeNode root){
if(root==null)return;
dealCore(root.left);
if(lastNode!=null){
if(lastNode.val>root.val){
if(firstErrorNode==null){
firstErrorNode=lastNode;
}
secondErrorNode=root;
}
}
lastNode=root;
dealCore(root.right);
}
}
看了思路:
public class RecoverTree {
TreeNode firstError = null;
TreeNode lastNode = null;
TreeNode secondError = null;
public void recoverTree(TreeNode root) {
inOrder(root);
int temp = firstError.val;
firstError.val = secondError.val;
secondError.val = temp;
}
public void inOrder(TreeNode root) {
if (root == null) {
return;
}
inOrder(root.left);
if (lastNode != null) {
if (lastNode.val > root.val) {
if (firstError == null) {
firstError = lastNode;
}
secondError = root;
}
}
lastNode = root;
inOrder(root.right);
}
}
【1】【leetcode-99】 恢复二叉搜索树的更多相关文章
- Java实现 LeetCode 99 恢复二叉搜索树
99. 恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出: [3,1,nu ...
- Leetcode 99.恢复二叉搜索树
恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 输出: [3,1,null,null,2] 示例 ...
- LeetCode:验证二叉搜索树【98】
LeetCode:验证二叉搜索树[98] 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当 ...
- Leetcode:235. 二叉搜索树的最近公共祖先
Leetcode:235. 二叉搜索树的最近公共祖先 Leetcode:235. 二叉搜索树的最近公共祖先 Talk is cheap . Show me the code . /** * Defin ...
- Leetcode:530. 二叉搜索树的最小绝对差
Leetcode:530. 二叉搜索树的最小绝对差 Leetcode:530. 二叉搜索树的最小绝对差 Talk is cheap . Show me the code . /** * Definit ...
- LeetCode(99):恢复二叉搜索树
Hard! 题目描述: 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出 ...
- 【遍历二叉树】07恢复二叉搜索树【Recover Binary Search Tree】
开一个指针数组,中序遍历这个二叉搜索树,将节点的指针依次保存在数组里, 然后寻找两处逆序的位置, 中序便利里BST得到的是升序序列 ++++++++++++++++++++++++++++++++++ ...
- Leetcode 538. 把二叉搜索树转换为累加树
题目链接 https://leetcode.com/problems/convert-bst-to-greater-tree/description/ 题目描述 大于它的节点值之和. 例如: 输入: ...
- LeetCode 669. 修剪二叉搜索树(Trim a Binary Search Tree)
669. 修剪二叉搜索树 669. Trim a Binary Search Tree 题目描述 LeetCode LeetCode669. Trim a Binary Search Tree简单 J ...
随机推荐
- 醉汉随机行走/随机漫步问题(Random Walk Randomized Algorithm Python)
世界上有些问题看似是随机的(stochastic),没有规律可循,但很可能是人类还未发现和掌握这类事件的规律,所以说它们是随机发生的. 随机漫步(Random Walk)是一种解决随机问题的方法,它 ...
- 2018-01微信小程序--直播
一. 小程序直播支持的格式 目前小程序支付两种格式直播 1) flv格式直播 2) rtmp格式直播 二. 能够开通小程序直播的行业类目 由于直播需要资质, 并不是每个企业都能够开通小程序直播, 微信 ...
- sshfs && tailon
sshfs 安装yum install glib2-devel fuse-sshfs官方版本地址https://github.com/libfuse/sshfs/releases目前最新版本:wget ...
- luogu3759 不勤劳的图书管理员 (树状数组套线段树)
交换的话,只有它们中间的书会对答案产生影响 树状数组记位置,套线段树记书的编号 它对应的页数和书的个数 然后就是减掉中间那些原来是逆序对的,再把交换以后是逆序对的加上 别忘了考虑这两个自己交换以后是不 ...
- POJ-3436 ACM Computer Factory(网络流EK)
As you know, all the computers used for ACM contests must be identical, so the participants compete ...
- Zabbix-proxy安装部署
原文链接:https://www.cnblogs.com/irockcode/p/6754659.html 环境: 因为公司需要监控远程客户机,但server端无法主动连接agent端,客户端可以连接 ...
- CodeForces - 589D(暴力+模拟)
题目链接:http://codeforces.com/problemset/problem/589/D 题目大意:给出n个人行走的开始时刻,开始时间和结束时间,求每个人分别能跟多少人相遇打招呼(每两人 ...
- Spring boot中使用aop详解
版权声明:本文为博主武伟峰原创文章,转载请注明地址http://blog.csdn.net/tianyaleixiaowu. aop是spring的两大功能模块之一,功能非常强大,为解 ...
- 【P2303】Longge的问题
题目大意:求\[\sum\limits_{i=1}^ngcd(n,i)\] 题解:发现 gcd 中有很多是重复的,因此考虑枚举 gcd. \[\sum\limits_{i=1}^ngcd(n,i)=\ ...
- c语言: 修改参数的地址,及注意事项
如果需要在函数中修改参数的地址,首先参数肯定要是指针类型,同时传递的参数不能直接使用数组变量,至少需要先转换一下. 比如: char str[] = "123"; 不能直接传 ab ...