2021-07-13:恢复二叉搜索树。给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?

福大大 答案2021-07-13:

大思路是求中序遍历,找逆序。一共有14种情况。如果是错误节点位置交换,题超难。如果是错误节点值交换,相对简单。实际上,错误节点位置交换才是正路,但leetcode没那么考。代码是错误节点值交换+莫里斯遍历。想看错误节点位置交换,请看文章末尾链接。
假设中序遍历结果是12345。14325两组降序。4和2交换。12435一组降序。4和3交换。
时间复杂度:O(N)。
空间复杂度:O(1)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
head := &TreeNode{val: 2}
head.left = &TreeNode{val: 3}
head.right = &TreeNode{val: 1}
recoverTree(head)
fmt.Println(head.val)
fmt.Println(head.left.val)
fmt.Println(head.right.val)
} // 不要提交这个类
type TreeNode struct {
val int
left *TreeNode
right *TreeNode
} // 如果能过leetcode,只需要提交这个方法即可
// 但其实recoverTree2才是正路,只不过leetcode没有那么考
func recoverTree(root *TreeNode) {
errors := twoErrors(root)
if errors[0] != nil && errors[1] != nil {
errors[0].val, errors[1].val = errors[1].val, errors[0].val
}
} func twoErrors(head *TreeNode) []*TreeNode {
ans := make([]*TreeNode, 2)
if head == nil {
return ans
}
cur := head
var mostRight *TreeNode
var pre *TreeNode
var e1 *TreeNode
var e2 *TreeNode
for cur != nil {
mostRight = cur.left
if mostRight != nil {
for mostRight.right != nil && mostRight.right != cur {
mostRight = mostRight.right
}
if mostRight.right == nil {
mostRight.right = cur
cur = cur.left
continue
} else {
mostRight.right = nil
}
}
if pre != nil && pre.val >= cur.val {
if e1 == nil {
e1 = pre
}
e2 = cur
}
pre = cur
cur = cur.right
}
ans[0] = e1
ans[1] = e2
return ans
}

执行结果如下:


左神java代码

2021-07-13:恢复二叉搜索树。给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出的更多相关文章

  1. 如何在删除ibdata1和ib_logfile的情况下恢复MySQL数据库

    昨天,有个朋友对公司内部使用的一个MySQL实例开启binlog,但是在启动的过程中失败了(他也没提,为何会失败),在启动失败后,他删除了ibdata1和ib_logfile,后来,能正常启动了,但所 ...

  2. 链表习题(8)-寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下

    /*寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下*/ /* 算法思想:定义两个指针,pre指向前驱结点,p指向当前结点,当p->data == k的时候,交换 p ...

  3. Entity framework 意外删除了表,如何在不影响其它表的情况下恢复回来

    关于EntityFramework数据迁移原理 查询数据库的表"__MigrationHistory",遍历代码库的Migrations文件夹下的所有文件,如果文件不在__Migr ...

  4. Oracle备份恢复之无备份情况下恢复undo表空间

    UNDO表空间存储着DML操作数据块的前镜像数据,在数据回滚,一致性读,闪回操作,实例恢复的时候都可能用到UNDO表空间中的数据.如果在生产过程中丢失或破坏了UNDO表空间,可能导致某些事务无法回滚, ...

  5. Arcgis api for javascript学习笔记 - 不改变默认端口(6080)情况下,外网访问Arcgis Server 发布的接口

    Arcgis Server发布的地图服务地址默认端口号是6080,假设本机上只对80端口做了外网映射,在IIS中部署了一个网站绑定了80端口,那么网站中某个页面通过arcgis api for js ...

  6. Merkle 树——空间换时间,分而治之的hash表,通过根节点是由它的两个子节点内容的哈希值组成来校验数据完整性,定位篡改的数据位置

    Merkle 树 图 1.5.6.1 - Merkle 树示例 默克尔树(又叫哈希树)是一种二叉树,由一个根节点.一组中间节点和一组叶节点组成.最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的 ...

  7. 在docker容器下利用数据卷实现在删除了mysql容器或者镜像的情况下恢复数据

    当把mysql容器销毁,在新建一个容器,进行之前的数据恢复. 因为之前建立了数据卷,那么现在就可以利用这个数据卷进行数据恢复. 使用docker volume create volume_name命令 ...

  8. 在Node.js中在保持目录结构的情况下压缩指定目录

    最近在做一个文件升级的功能,需要从下载服务器中指定目录下的文件.在学习了zlib后发现这个模块达不到这个功能 在查找资料后发现后发现 archiver 模块很好用,不过我也发现大部分中文资料没有如果查 ...

  9. 两个变量交换数字 不用第三个变量的情况下 int a = 5,b = 6

    今天可是涨见识额 记录一下 第一种方法: a=a+bb=a-ba=a-b 第二种: b= a+(a=b)*0 一句话搞定

  10. JS在不改变原数组的情况下复制一个新的数组

    var a={1,2,3,4} var data= JSON.parse(JSON.stringify(a[0])) a.push(data) a[4]=5 这样就不会改变原数组a的数据

随机推荐

  1. 【picoCTF]cookies write up

    顾名思义,这一挑战涉及对cookie的简单操作.登录页面会显示一个搜索框,其中包含一个输入字段,用于检查您为其提供的 Cookie 类型. 点击链接,页面如下: 随便在框里输入内容,显示如下: 输出返 ...

  2. windows中使用jenkins部署项目,后端无法启动问题

    忙活一下午+一上午,问题终于解决了.找了各种办法,最终解决方式如下: 1.jenkins打包成功,到接口会报502异常 原因:后端未成功启动 解决办法: 1.刚开始使用shell命令,无法查杀进程,后 ...

  3. 通用图像分割任务- 使用 Mask2Former 和 OneFormer

    本文介绍两个领先的图像分割神经网络模型: Mask2Former 和 OneFormer.相关模型已经在 Transformers 提供. Transformers 是一个开源库,提供了很多便捷的先进 ...

  4. Windows 10 ltsc 2021 (2021/11/17更新版本)

    Windows 10 Enterprise LTSC 2021 (x86) - DVD (Chinese-Simplified)文件:SW_DVD9_WIN_ENT_LTSC_2021_32BIT_C ...

  5. Redis Cluster集群搭建及节点的添加、删除

    系统性学习,移步IT-BLOG 一.什么是 Redis Cluster Redis 是在内存中保存数据的,而我们的电脑一般内存都不大,这也意味着 Redis 不适合存储大数据,适合存储大数据的是 Ha ...

  6. Mybatis分页插件PageHelper的配置及使用方法

    尊重人家的知识成果 推荐 该作者总结的不错! --->> --->> @author 扎心了老铁 Mybatis分页插件PageHelper的配置及使用方法

  7. selenium中处理验证码问题1-获取验证码图片

    selenium中处理验证码问题: 验证码: 基本作用:可以实现当前访问页面的数据安全性.还可以减少用户的并发数:实现大流量的分流 类型:1.纯数字.纯字母 2.汉字组合 3.数学运算题 4.滑动 5 ...

  8. 教你如何通过CodeArts IDE插件调用API,高效合成语音

    摘要:本实验基于华为云自研CodeArts IDE,指导用户通过使用华为云API,来实现一个文字合成语音的应用. 本文分享自华为云社区<通过CodeArts IDE插件调用API,高效合成语音! ...

  9. vue中实现video的动态src绑定

    Vue中实现video的动态src 试了网上的$refs方法发现并没有用 解决方案: 通过require方法  <div>     <video :src='url' @click= ...

  10. 随机服务系统模拟—R实现(二)

    M/M/1随机服务系统的模拟 M/M/1模型是一种出生-死亡过程,此随机过程中的每一个状态代表模型中人数的数目.因为模型的队列长度无限且参与人数亦无限,故此状态数目亦为无限.例如状态0表示模型闲置.状 ...