恢复二叉搜索树

题目描述:给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。

进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/recover-binary-search-tree/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:递归法
  • 首先,通过中序遍历得到二叉搜索树的所有节点allNodes,正常情况下,如果没有节点被错误的交换,allNodes所有节点应该是按升序排列,所以要找出被交换的2个节点;
  • 从后往前遍历allNodes,找到第一个值比前面的值小的节点,即为错误的第一个节点high;
  • high-1开始往前遍历allNodes,找到第一个值比high节点小的节点low,low+1位置的节点即为错误的第二个节点;
  • 交换low和high2个节点的值,即可恢复这棵树。
import java.util.ArrayList;
import java.util.List; public class LeetCode_099 {
public static void recoverTree(TreeNode root) {
List<TreeNode> allNodes = inOrder(root);
int high = -1, low = -1;
for (int i = allNodes.size() - 1; i >= 1; i--) {
// 找到上面的要交换的节点
if (allNodes.get(i).val < allNodes.get(i - 1).val) {
high = i;
break;
} } // 找到下面要交换的节点
for (low = high - 1; low >= 0; low--) {
if (allNodes.get(low).val < allNodes.get(high).val) {
break;
}
}
low++;
int temp = allNodes.get(low).val;
allNodes.get(low).val = allNodes.get(high).val;
allNodes.get(high).val = temp;
} /**
* 中序遍历
*
* @param root
* @return
*/
private static List<TreeNode> inOrder(TreeNode root) {
List<TreeNode> nodes = new ArrayList<>();
if (root != null) {
nodes.addAll(inOrder(root.left));
nodes.add(root);
nodes.addAll(inOrder(root.right));
}
return nodes;
} public static void main(String[] args) {
TreeNode root = new TreeNode(3);
root.left = new TreeNode(1);
root.right = new TreeNode(4);
root.right.left = new TreeNode(2); recoverTree(root);
System.out.println("恢复之前");
root.print();
System.out.println();
System.out.println("恢复之后");
root.print();
}
}

【每日寄语】 感谢不离不弃的你,让我知道仍有人爱我。感谢你的支持,不论今天有多挫折,我仍会勇敢地活下去。

LeetCode-099-恢复二叉搜索树的更多相关文章

  1. Leetcode 99.恢复二叉搜索树

    恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 输出: [3,1,null,null,2] 示例  ...

  2. Java实现 LeetCode 99 恢复二叉搜索树

    99. 恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出: [3,1,nu ...

  3. 【1】【leetcode-99】 恢复二叉搜索树

    (没思路) 99. 恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2]   1   /  3   \ ...

  4. LeetCode:验证二叉搜索树【98】

    LeetCode:验证二叉搜索树[98] 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当 ...

  5. Leetcode:235. 二叉搜索树的最近公共祖先

    Leetcode:235. 二叉搜索树的最近公共祖先 Leetcode:235. 二叉搜索树的最近公共祖先 Talk is cheap . Show me the code . /** * Defin ...

  6. Leetcode:530. 二叉搜索树的最小绝对差

    Leetcode:530. 二叉搜索树的最小绝对差 Leetcode:530. 二叉搜索树的最小绝对差 Talk is cheap . Show me the code . /** * Definit ...

  7. LeetCode(99):恢复二叉搜索树

    Hard! 题目描述: 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2]   1   /  3   \   2 输出 ...

  8. Leetcode 538. 把二叉搜索树转换为累加树

    题目链接 https://leetcode.com/problems/convert-bst-to-greater-tree/description/ 题目描述 大于它的节点值之和. 例如: 输入: ...

  9. 【遍历二叉树】07恢复二叉搜索树【Recover Binary Search Tree】

    开一个指针数组,中序遍历这个二叉搜索树,将节点的指针依次保存在数组里, 然后寻找两处逆序的位置, 中序便利里BST得到的是升序序列 ++++++++++++++++++++++++++++++++++ ...

  10. LeetCode 669. 修剪二叉搜索树(Trim a Binary Search Tree)

    669. 修剪二叉搜索树 669. Trim a Binary Search Tree 题目描述 LeetCode LeetCode669. Trim a Binary Search Tree简单 J ...

随机推荐

  1. WTM多租户改造

    首先简单说下多租户的几种实现方式 多租户(Multi-Tenant ),即多个租户共用一个实例,租户的数据既有隔离又有共享,说到底是要解决数据存储的问题. 常用的数据存储方式有三种. 方案一:独立数据 ...

  2. Dapr Actor 的微服务架构

    Dapr中的Actor模型,和Orleans的Virtual Actor一脉相传, 圣杰写过一篇文章Orleans 知多少 | .NET Core 分布式框架介绍过.简单来讲:Actor模型 = 状态 ...

  3. SSL证书,IIS7、IIS8,http自动跳转到HTTPS

    安装"URL REWRITE2 " 伪静态模块,IIS7需要先确认是否安装 "URL REWRITE2 " 伪静态模块 , 如果您已经安装可以跳过 下载地址:h ...

  4. Spring学习七:ComponentScan注解

    今天主要从以下几个方面来介绍一下@ComponentScan注解: @ComponentScan注解是什么 @ComponentScan注解的详细使用 1.ComponentScan注解是什么 其实很 ...

  5. Ajax使用post方式发送数据注意事项

    Ajax使用post方式给服务器传递数据时,需要将传递的字符串转化为模拟from表单发送数据的XML格式 在open之后奢姿头协议信息,模拟from表单传递数据 xhr.setRequestHeade ...

  6. ARP数据包分析

    转载请注明来源:https://www.cnblogs.com/hookjc/ 本机IP:192.168.0.1 (c0 a8 00 01)本机MAC:00-50-56-c0-00-01目标IP:19 ...

  7. 修改注册表使win server 2012R2开机进入桌面而不是开始界面

    首先,使用WIN+R快捷键打开运行命令,使用命令打开注册表编辑器 然后,进入注册表之后,我们一次定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ ...

  8. Docker容器和宿主机互传文件

    1.docker容器向宿主机传送文件 格式: docker cp container_id:<docker容器内的路径> <本地保存文件的路径> 例: docker cp 10 ...

  9. Springboot整合ElasticSearch进行简单的测试及用Kibana进行查看

    一.前言 搜索引擎还是在电商项目.百度.还有技术博客中广泛应用,使用最多的还是ElasticSearch,Solr在大数据量下检索性能不如ElasticSearch.今天和大家一起搭建一下,小编是看完 ...

  10. 《PHP程序员面试笔试宝典》——如何进行自我介绍?

    本文摘自<PHP程序员面试笔试宝典> PHP面试技巧分享,PHP面试题,PHP宝典尽在"琉忆编程库". 自我介绍是面试中至关重要的一个步骤,很多面试官对求职者提出的第一 ...