当前位置: 首页 > 编程日记 > 正文

刻意练习:LeetCode实战 -- Task24. 恢复二叉搜索树

背景

本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。

本次任务的知识点:树

是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由 n(n>0) 个有限节点组成的一个具有层次关系的集合。

把它叫做「树」是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

它具有以下的特点:

  • 每个节点都只有有限个子节点或无子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树;
  • 树里面没有环路。

题目

  • 题号:99
  • 难度:困难
  • https://leetcode-cn.com/problems/recover-binary-search-tree/

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

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

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

实现

第一种:利用中序遍历

二叉搜索树是左孩子小于根节点,右孩子大于根节点的树,所以做一次中序遍历,产生的序列就是从小到大排列的有序序列。

回到这道题,题目交换了两个数字,其实就是在有序序列中交换了两个数字。而我们只需要把它还原。

交换位置有两种情况:

  • 相邻的两个数字交换

[ 1 2 3 4 5 ] 中 2 和 3 进行交换,[ 1 3 2 4 5 ],这样的话只产生一组逆序的数字(正常情况是从小到大排序,交换后产生了从大到小),3 2。

我们只需要遍历数组,找到后,把这一组的两个数字进行交换即可。

  • 不相邻的两个数字交换

[ 1 2 3 4 5 ] 中 2 和 5 进行交换,[ 1 5 3 4 2 ],这样的话其实就是产生了两组逆序的数字对。5 3 和 4 2。

所以我们只需要遍历数组,然后找到这两组逆序对,然后把第一组前一个数字和第二组后一个数字进行交换即完成了还原。

综上,在中序遍历中,只需要利用一个 pre 节点和当前节点比较,如果 pre 节点的值大于当前节点的值,那么就是我们要找的逆序的数字。分别用两个指针 first 和 second 保存即可。如果找到第二组逆序的数字,我们就把 second 更新为当前节点。最后把 first 和 second 两个的数字交换即可。

  • 执行结果:通过
  • 执行用时:132 ms, 在所有 C# 提交中击败了 72.41% 的用户
  • 内存消耗:27.6 MB, 在所有 C# 提交中击败了 100.00% 的用户
/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int x) { val = x; }* }*/
public class Solution
{public void RecoverTree(TreeNode root){inorderTraversal(root);if(first == null || second == null)return;int temp = first.val;first.val = second.val;second.val = temp;}private TreeNode pre = null;private TreeNode first = null;private TreeNode second = null;private void inorderTraversal(TreeNode root){if (root == null){return;}inorderTraversal(root.left);if (pre != null && pre.val > root.val){//第一次遇到逆序对if (first == null){first = pre;second = root;}else{//第二次遇到逆序对second = root;}}else{pre = root;}inorderTraversal(root.right);}
}

Python 语言

  • 执行结果:通过
  • 执行用时:64 ms, 在所有 Python3 提交中击败了 93.67% 的用户
  • 内存消耗:14 MB, 在所有 Python3 提交中击败了 5.32% 的用户
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def recoverTree(self, root: TreeNode) -> None:"""Do not return anything, modify root in-place instead."""self.inorderTraversal(root)if self.first is None or self.second is None:return Noneself.first.val, self.second.val = self.second.val, self.first.valdef __init__(self):self.pre = Noneself.first = Noneself.second = Nonedef inorderTraversal(self, root: TreeNode) -> None:if root is None:return Noneself.inorderTraversal(root.left)if self.pre is not None and self.pre.val > root.val:if self.first is None:self.first = self.preself.second = rootelse:self.second = rootelse:self.pre = rootself.inorderTraversal(root.right)

往期活动

LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!

  • Python基础刻意练习活动即将开启,你参加吗?
  • Task01:变量、运算符与数据类型
  • Task02:条件与循环
  • Task03:列表与元组
  • Task04:字符串与序列
  • Task05:函数与Lambda表达式
  • Task06:字典与集合
  • Task07:文件与文件系统
  • Task08:异常处理
  • Task09:else 与 with 语句
  • Task10:类与对象
  • Task11:魔法方法
  • Task12:模块

我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

相关文章:

Solaris下ftp配置(初稿-待补充)

1.自带ftp版本 Version wu-2.6.2 2.ftp启动与停止 启动并启用ftp: svcadm enable network/ftp 停止并禁用ftp: svcadm disable network/ftp 3.使某个系统用户无法使用ftp或者恢复使用ftp vi /etc/ftpd/ftpusers 向其中添加要禁止使用ftp的…

女生参加web前端培训可以吗

​ 近几年,web前端被视为互联网行业最热门编程语言技术之一,越来越多的人开始想要学习web前端技术,其中不乏有一些女性学习,那么很多人就要问了,女生参加web前端培训可以吗?我们来看看下面的详细介绍吧。 ​  女生参…

春节期间停止更新

非常抱歉地跟各位说一下,因为老家并没有拉宽带,所以春节期间无法进行更新。虽然说我可以背着笔记本回家,然后再到朋友处蹭一下网络。但想到一年365天,能回家的就那么几天,只是想好好陪陪父母,伴伴自己的老婆…

刻意练习:LeetCode实战 -- Task26.判断子序列

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了…

spring @component的作用

转自:https://www.cnblogs.com/lyjing/p/8427832.html1、controller 控制器(注入服务) 2、service 服务(注入dao) 3、repository dao(实现dao访问) 4、component (把普通pojo实例化到…

使用JavaScript变量需要注意哪些语法细节?

使用JavaScript变量需要注意哪些语法细节?JavaScript在很多地方经常会涉及到,尤其是JavaScript变量这方面,在使用变量时,还有一些值得注意的语法细节,下面进行详细讲解。 使用JavaScript变量需要注意哪些语法细节? 1. 更新变量的…

手把手教你搭建一个学习Python好看的 Jupyter 环境

又到摆脱重复工作,换个心情,然而并没有软用的时间了。这次,教大家如何搭建一个好看的jupyter环境。安装Jupyter先来展示一下我的环境python: 3.5.*macos: 10.12.4安装Jupyter的过程只需安装Anaconda即可。测试一下初始设置:jupyte…

刻意练习:LeetCode实战 -- Task27.分发饼干

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了…

祝贺《WCF邮件通信系统》在高阳市场研究汇编第五期发表

上次给公司的市场研究汇编投稿,只写了一个PPT格式的《WCF邮件通信系统》,编辑把它整理成了PDF格式的内容,感觉很好,所以我把PDF原文中的有关内容存储成了图片,发表在这里,庆贺一下。PDF原文地址&#xff1a…

学软件测试有前途吗

学软件测试有前途吗?很多人都关心这个问题,最近几年,软件测试这个行业在很多企业都是非常刚需的,随着互联网的飞快发展,IT行业出现日新月异的变化,企业的大量需求,人才的严重匮乏,导致IT行业&a…

Active Directory 账号迁移配置介绍

首先介绍一下环境: 生产域环境: example.cn 测试域环境: fengdian.info 系统平台: 2K08 R2 林、域功能级别:Windows Server 2008 要求: 测试域环境“fengdian.info”同步生产域环境所有用户账号,实现测试环境和生产环境的基本统 一,方便功能测…

VIM命令快速记忆(转自杰哥)

因为自己也是个linuxer 熟练运用VIM是必须的,恰好学长杰哥对此有研究, 转来给大家分享。对此表达对杰哥的敬意。 有好东西分享给大家才能相互学习是吧。 要做个Linuxer,VIM的操作是必须就跟手指头盲打键盘那么熟练。 首先说下Vim的两种最常用…

刻意练习:LeetCode实战 -- Task28.跳跃游戏

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了…

类操作是什么意思?jQuery的类操作教程

类操作就是通过操作元素的类名进行元素样式操作,当元素样式比较复杂时,如果通过css()方法实现,需要在CSS里编写很长的代码,既不美观也不方便。而通过写一个类名,把类名加上或去掉就会显得很方便。下面通过代码演示类的…

刻意练习:LeetCode实战 -- Task29. 加油站

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了…

C#从SQL server数据库中读取l图片和存入图片

一、从图片中获得二进制值的基本方法:Image.Save 方法 (String, ImageFormat) 这会将保存 Image 写入指定的文件中指定的格式。 命名空间: System.Drawing 程序集: System.Drawing(位于 System.Drawing.dll) 语法: public void S…

linux下查看内存使用情况

在Linux下查看内存我们一般用free命令:[rootscs-2 tmp]# free total used free shared buffers cachedMem: 3266180 3250004 16176 0 110652 2668236-/ buffers/cache: 471116 2795064Swa…

现在转行学习UI设计好不好就业

​ UI设计是很多企业都会有需求的一个岗位,对于现在转行学习UI设计好不好就业这个问题,小编的回答是肯定的,最直接的方法就是上招聘信息,如果说招聘网站上UI设计师职位很少,那就说明UI设计行业已经差不多饱和了。 ​ …

刻意练习:LeetCode实战 -- Task30.通配符匹配

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了…

iOS 11 安全区域适配总结

2019独角兽企业重金招聘Python工程师标准>>> 导语:本文主要是对iOS 11下APP中tableView内容下移20pt或下移64pt的问题适配的一个总结。内容包括五个部分:问题的原因分析、adjustContentInset属性的计算方式、什么情况下的tableView会发生内容…

(广州)软件开发定制服务,工作流引擎 OA 库存管理系统

本人专注于工作流的研究设计同时提供软件开发定制服务,工作流引擎 OA系统 库存管理系统 如果有机会合作共事请联系:15817167503(本人在广州) QQ:1311663711 加时请注明软件定制 广州软件定制开发 转载于:https://www.cnblogs.com/…

Java类加载机制详解【java面试题】

Java类加载机制详解【java面试题】 (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户…

C#获取文件的当前路径

1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径。 2.System.Environment.CurrentDirectory -获取和设置当前目录(该进程从中启动的目录)的完全限定目录。 3.System.IO.Directory.GetCurrentDirectory() &a…

c# ThreadPool 判断子线程全部执行完毕的四种方法

1、先来看看这个多线程编程多线程用于数据采集时,速度明显很快,下面是基本方法,把那个auto写成采集数据方法即可。using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace ConsoleApplication1{…

腾讯精选练习 50 题(Leetcode)笔记 PDF下载!

昨天在知识星球中立了一个Flag,第一步采取的行动就是把以前刷的“腾讯精选练习 50 题”重新梳理一下,就有了今天这本170多页的小册子。 这本小册子即可以作为学习数据结构与算法课程的参考资料,也可以作为备考计算机类研究生的备考资料。希望…

Python培训:try-except语句与else子句联合使用处理可能出现的程序异常

异常处理的主要目的是防止因外部环境的变化导致程序产生无法控制的错误,而不是处理程序的设计错误。因此,将所有的代码都用try语句包含起来的做法是不推荐的,try语句应尽量只包含可能产生异常的代码。Python中try-except语句还可以与else子句…

Backup Exec 2012 备份和还原活动目录(非授权还原)

延续以上两篇,安装配置完毕后,开始进行备份操作。 环境一如上篇: DC: pdc1.fengdian.info BE2012 Svr: backup.fengdian.info 本例使用BE2012对活动目录进行备份和后续的还原操作,通过模拟误删除DC中的两个OU及其用户账号,使用先…

hdu3368 Reversi

题意:一种翻转棋游戏,对当前的棋局,问黑子下一步最多能将几个白子翻为黑子,(当前黑子与原先棋盘中的黑子的连线中间的白子会翻成黑子) 分析:很简单的搜索题,不过一开始一直WA&#x…

有符号整型的数据范围为什么负数比正数多一个?

背景 我们先看Leetcode的这道题目: 标题:50. Pow(x, n)难度:中等https://leetcode-cn.com/problems/powx-n/ 实现 pow(x, n) ,即计算 x 的 n 次幂函数。 示例 1: 输入: 2.00000, 10 输出: 1024.00000示例 2: 输入: 2.10000, 3…

UI设计培训:UI构思创意技巧和方法

想要作为一名合格的UI设计师,那么创意技巧和方法是非常重要的,很多刚入职场的新人或者是工作多年的设计师都会在创意技巧和方法上遇到瓶颈,下面小编为大家整理一些UI构思创意技巧和方法,希望能够帮助到大家。 UI设计培训&#xff…