【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 ...
随机推荐
- 【BZOJ1999】【NOIP2007】树网的核 单调队列优化DP
题目描述 题目很长,大家自己去看吧. bzoj vijos 原题\(n\leq 300\) 加强版\(n\leq 500000\) 题解 这种东西当然要猜结论的啦,否则会比较麻烦. 结论1:如果有很多 ...
- CODEFORCES掉RATING记 #4
比赛:Codeforces Round #427 (Div. 2) 时间:2017.7.31晚 开场发现有6道题,都是水题(可能我只会做水题) A:比较\(2t_1+sv_1\)与\(2t_2+sv_ ...
- Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)
D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: = 的情况我们用并查集把他们扔到一个集合,然后根据 > ...
- 在ubuntu上安装运行ionic项目
1.安装nodejs.npm curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt-get install - ...
- Hdoj 2036.改革春风吹满地 题解
Problem Description " 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次 ...
- 通过Nifi 导入csv文件到HDFS
1. 拖入一个GetHttp 的processor 右健选择 configure -> properties , 设置 url 和 filename url : http://s ...
- Arukas.io云主机安装CentOS
创建应用 1 jdeathe/centos-ssh:centos-6 启动应用 电机启动应用,应用会自动部署,等显示Running 就说明成功了.估计需要几分钟. 查看用户以及密码 自己保存下用户 ...
- SHOI2008仙人掌图(tarjan+dp)
Solution 好题啊没的说. 本题需要求出仙人掌的直径,但仙人掌是一个带有简单环的一张图无法直接用树形dp求解,但它有一个好东西就是没有类似环套环的东西,所以我们在处理时就方便了一些. 思路:ta ...
- 解决Oracle死锁问题步骤
出现问题: 使用jdbc进行批量插入,一直卡在执行界面上,不走代码,预估应该是产生了死锁 1. 使用如下语句查询oracle数据库中的死锁的表和死锁类型 select b.owner,b.object ...
- QML-WebEngineView加载html(Echarts绘图)
实现QML中运用webEngineView加载Echarts GitHub:八至 作者:狐狸家的鱼 本文链接:QML-WebEngineView加载Echarts 一.前言 Qt允许使用混合GUI创建 ...