热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

leetcode99.恢复二叉搜索树/中序遍历

文章目录题目:二叉搜索树中的两个节点被错误地交换。基本思想1:中序遍历题目:二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下


文章目录

    • 题目:二叉搜索树中的两个节点被错误地交换。
    • 基本思想1:中序遍历


题目:二叉搜索树中的两个节点被错误地交换。

请在不改变其结构的情况下,恢复这棵树。

示例 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) 空间复杂度的解法很容易实现。
  • 你能想出一个只使用常数空间的解决方案吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


基本思想1:中序遍历

二叉搜索树中序遍历的结果一定是升序序列,那么在该题中中序遍历的序列在交换两个元素后,成为升序序列。


  • 首先,对二叉树进行中序遍历,并保存中序遍历的结果序列
  • 寻找结果序列中第一个逆序的元素前面的元素pre
  • 从元素pre一直往后寻找,当找到一个大于该元素的元素temp时,temp前面的元素post就是需要交换的元素
  • 将pre和post这两个元素进行交换

空间复杂度为O(n)的写法
定义一个数组保存中序遍历的顺序

/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:vector<TreeNode*> vec;void recoverTree(TreeNode* root) {inorder(root);int pre &#61; 0, i;for(i &#61; 1; i < vec.size(); &#43;&#43;i){if(vec[i]->val > vec[pre]->val)&#43;&#43;pre;elsebreak;}for(; i < vec.size(); &#43;&#43;i){if(vec[i]->val > vec[pre]-> val)break;}--i;int t &#61; vec[i]->val;vec[i]->val &#61; vec[pre]->val;vec[pre]->val &#61; t;}void inorder(TreeNode* root){if(root &#61;&#61; NULL)return;inorder(root->left);vec.push_back(root);inorder(root->right);}
};

空间复杂度为O&#xff08;1&#xff09;的写法&#xff1a;
定义两个变量来保存逆序的两个节点

/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:void recoverTree(TreeNode* root) {TreeNode* pre1 &#61; NULL, *pre2 &#61; NULL;inorder(root, pre1, pre2);int t &#61; pre1->val;pre1->val &#61; pre2->val;pre2->val &#61; t;}void inorder(TreeNode* root, TreeNode* &pre1, TreeNode* &pre2){if(root &#61;&#61; NULL)return;inorder(root->left, pre1, pre2);if(pre1 &#61;&#61; NULL){//root是根节点的情况pre1 &#61; root;}else{if(root->val > pre1->val && (!pre2 || root->val < pre2->val)){pre1 &#61; root;}else if(pre2 &#61;&#61; NULL){//此时找到了第一个需要交换的节点&#xff0c;保存在pre2中pre2 &#61; pre1;pre1 &#61; root;}if((root->val < pre1->val) && (pre2) && (pre2->val > root->val)){//此时找到了第二个需要交换的节点保存在pre1中pre1 &#61; root;}}inorder(root->right, pre1, pre2);}
};

推荐阅读
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • 如何利用C语言进行高效的商品管理程序设计与开发
    本文详细探讨了使用C语言高效开发商品管理系统的技巧与方法。通过简洁明了的代码示例,文章逐步引导读者掌握商品管理程序的设计与实现,适合初学者及有一定基础的开发者参考学习。 ... [详细]
  • 作业调度问题 | 集合 3(利用 Java 中的 TreeSet 实现) ... [详细]
  • 在Windows命令行中,通过Conda工具可以高效地管理和操作虚拟环境。具体步骤包括:1. 列出现有虚拟环境:`conda env list`;2. 创建新虚拟环境:`conda create --name 环境名`;3. 删除虚拟环境:`conda env remove --name 环境名`。这些命令不仅简化了环境管理流程,还提高了开发效率。此外,Conda还支持环境文件导出和导入,方便在不同机器间迁移配置。 ... [详细]
  • 在MFC开发过程中,利用Windows内置的文件对话框可以显著提高文件操作的效率。本文总结了使用文件对话框进行文件选择和处理的经验,详细介绍了相关API的调用方法和参数设置,如`CFileDialog`类的使用、结构体`OPENFILENAME`的配置以及如何获取选中的文件路径。通过这些技巧,开发者可以快速实现文件的打开、保存等功能,提升应用程序的用户体验。 ... [详细]
  • 深入RTOS实践,面对原子操作提问竟感困惑
    在实时操作系统(RTOS)的实践中,尽管已经积累了丰富的经验,但在面对原子操作的具体问题时,仍感到困惑。本文将深入探讨RTOS中的原子操作机制,分析其在多任务环境下的重要性和实现方式,并结合实际案例解析常见的问题及解决方案,帮助读者更好地理解和应用这一关键技术。 ... [详细]
  • LeetCode 35 搜索插入位置的 C 语言实现详解与代码优化
    本文详细解析了 LeetCode 第 35 题 "搜索插入位置" 的 C 语言实现方法,并进行了代码优化。题目要求在已排序且无重复元素的数组中查找目标值,并返回其索引;若目标值不在数组中,则返回按顺序插入该值的位置。通过具体示例,如输入数组 [1, 3, 5] 和目标值 4,文章展示了如何高效地解决这一问题。 ... [详细]
  • Python正则表达式详解:掌握数量词用法轻松上手
    Python正则表达式详解:掌握数量词用法轻松上手 ... [详细]
  • 本文深入探讨了 CF570D 问题中树的请求处理方法,重点分析了长链剖分技术的应用与优化。题目涉及一棵包含 n 个节点的树,每个节点上有一个字符。每次查询时,需要处理某个节点 x 的相关请求。通过长链剖分技术,可以高效地解决这类问题,显著提升算法性能。本文不仅介绍了基本的长链剖分原理,还详细讨论了其在具体实现中的优化技巧,为解决类似问题提供了宝贵的参考。 ... [详细]
  • 本文探讨了如何使用Python实现散列表(即哈希表)的直接地址技术,通过键值对快速定位内存中的数据存储位置,提高了数据检索的效率。该方法利用哈希函数将键映射到特定的数组索引,从而实现快速存取操作。 ... [详细]
  • Codeforces 1065D 解题心得与代码实现分析 ... [详细]
  • 24点纸牌智力挑战:经典数学益智游戏
    24点纸牌智力挑战是一款广受欢迎的经典数学益智游戏。玩家需要从一副扑克牌中随机抽取四张牌,通过加、减、乘、除等运算,在最短时间内计算出结果为24,最先达成目标的玩家获胜。游戏中,J、Q、K分别代表11、12、13,增加了游戏的复杂性和趣味性。 ... [详细]
  • Elasticsearch 嵌套调用中动态类导致数据返回异常分析与解决方案 ... [详细]
  • 在上篇文章的基础上,本文将继续探讨 Linux 设备驱动中的设备模型与 `devicedriverbus` 机制。在将设备注册到总线之前,需要先创建 `device` 对象。可以通过静态定义 `device` 结构体变量,并调用 `device_register` 函数来完成这一过程。此外,文章还将详细解析设备模型的内部工作机制,以及 `devicedriverbus` 机制如何实现设备与驱动的自动匹配和管理。 ... [详细]
author-avatar
瑞景地产王琴
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有