Recover Binary Search Tree

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?

要求找到BST中放错位置的两个节点.

直观思路是使用中序遍历来解.一颗正常的BST,它的正常中序遍历序列是递增序列(非递减,如果有重复元素).所以如果有元素被交换,则会出现递减的情况.如果不是前后继的两个节点,则只会出现一次颠倒的情况,而如果不是前后继,则会出现两次,举例如下:

1 2 3 4 5 6 7这是一个正常的BST中序遍历序列.如果是前后继的两个节点,比如3,4交换,则中序遍历序列是: 1 2 4 3 5 6 7. 4 3出现一次逆序. 如果不是前后继,比如3,5交换,则中序遍历为1 2 5 4 3 6 7. 则5 4, 4 3是两次逆序.可以看出在第一个逆序对里前面一个值是第一个逆序节点.而在后一个逆序对里后一个值是逆序节点. 而在仅有一个逆序对的情况下,前一个值为第一个逆序节点,后一个值为第二个逆序节点. 时间复杂度为O(n).空间复杂度为O(nlogn).代码如下:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def recoverTree(self, root):""":type root: TreeNode:rtype: void Do not return anything, modify root in-place instead."""if not root:returnstack = []prev = TreeNode(-sys.maxint-1)cur = rootformer = Nonelatter = Nonewhile stack or cur:if cur:stack.append(cur)cur = cur.leftelse:cur = stack.pop()if cur.val < prev.val:if not former:former = prevlatter = curprev = curelse:latter = curbreakelse:prev = curcur = cur.rightformer.val, latter.val = latter.val, former.val

题目要求的O(1)空间复杂度需要结合morris遍历来做, 详见http://www.cnblogs.com/AnnieKim/archive/2013/06/15/morristraversal.html

转载于:https://www.cnblogs.com/sherylwang/p/5660919.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot三种过滤功能的使用与比较

若要实现对请求的过滤&#xff0c;有三种方式可供选择&#xff1a;filter、interceptort和aop。本文主要讨论三种拦截器的使用场景与使用方式。 下文中的举例功能是计算每个请求的从开始到结束的时间&#xff0c;例子来源是慕课网。 一、filter 特点&#xff1a;可以获取原始的…

后缀的形容词_构词法(18)构成形容词的常见后缀 3

即时练习一、按要求改写下列单词。1. Japan →___________ adj. 日本(人)的2. Canton →_________ adj. 广东(人)的3. Vietnam →__________ adj. 越南(人)的4. Europe →__________ adj. 欧洲(人)的5. India → ________ adj. 印度(人)的6. Africa →_______ adj. 非洲(人)的7…

CentOS 桌面启动无登录界面

最近VMWare下搞了2个CentOS 32bit虚拟机, 装了些软件之后&#xff0c;都遇到开机无法显示登录界面&#xff0c; 仅能看见桌面背景图的情况。 以下是我搜索很久汇总的方法。 尝试按 ctrl alt F3(快捷键可能有所不同), 由桌面模式进入命令行模式。 直接 startx 报错&#xf…

批量删除推文_如何搜索(和删除)您的旧推文

批量删除推文“The internet never forgets” is an aphorism that isn’t entirely true, but it’s worth thinking about whenever you post to social media. If you think your Twitter profile needs a bit of a scrub, here’s how to search and delete those old twee…

[USACO13JAN] Cow Lineup (单调队列,尺取法)

题目链接 Solution 尺取法板子,算是复习一波. 题中说最多删除 \(k\) 种,那么其实就是找一个颜色种类最多为 \(k1\) 的区间; 统计一下其中最多的颜色出现次数. 然后直接尺取法,然后每次对于 \(col[r]\) 进行统计,时间复杂度 \(O(n)\) . Code #include<bits/stdc.h> using …

智能记忆功能nest_如何设置和安装Nest Protect智能烟雾报警器

智能记忆功能nestIf you want to add a bit more convenience and safety to your home’s smoke alarm setup, the Nest Protect comes with a handful of great features to make that a reality. Here’s how to set it up and what all you can do with it. 如果您想为您的…

网格自适应_ANSYS 非线性自适应(NLAD)网格划分及应用举例

文章来源&#xff1a;安世亚太官方订阅号&#xff08;搜索&#xff1a;Peraglobal&#xff09;在复杂的结构设计分析中&#xff0c;通常很难确定在高应力区域中是否生成适当的细化网格。在做非线性大应变分析仿真时&#xff0c;可能由于单元变形过大&#xff0c;导致网格畸变&a…

js继承优化

在看《js设计模式》中&#xff0c;作者提到了js中的两种继承方式&#xff1a;类继承 或 原型继承&#xff0c;或许是本人才疏学浅&#xff0c;竟发现一些问题。 一、类继承 思路&#xff1a;作者的思路是使用基于类来继承&#xff0c;并且做了一个extend函数&#xff0c;在第一…

python---[列表]lsit

内置数据结构&#xff08;变量类型&#xff09; -list -set -dict -tuple -list&#xff08;列表&#xff09; -一组又顺序的数据组合 -创建列表 -空列表 list1 []        print(type(list1))        print(list1)        list2 [100]       …

唤醒计算机运行此任务_如何停止Windows 8唤醒计算机以运行维护

唤醒计算机运行此任务Windows 8 comes with a new hybrid boot system, this means that your PC is never really off. It also means that Windows has the permission to wake your PC as it needs. Here’s how to stop it from waking up your PC to do maintenance tasks…

转整型_SPI转can芯片CSM300详解、Linux驱动移植调试笔记

一口君最近移植了一款SPI转CAN的芯片CSM300A&#xff0c;在这里和大家做个分享。一、CSM300概述CSM300(A)系列是一款可以支持 SPI / UART 接口的CAN模块。1. 简介CSM300(A)系列隔离 SPI / UART 转 CAN 模块是集成微处理器、 CAN 收发器、 DC-DC 隔离电源、 信号隔离于一体的通信…

matlab练习程序(二值图像连通区域标记法,一步法)

这个只需要遍历一次图像就能够完全标记了。我主要参考了WIKI和这位兄弟的博客&#xff0c;这两个把原理基本上该介绍的都介绍过了&#xff0c;我也不多说什么了。一步法代码相比两步法真是清晰又好看&#xff0c;似乎真的比两步法要好很多。 代码如下&#xff1a; clear all; c…

pc微信不支持flash_在出售PC之前,如何取消对Flash内容的授权

pc微信不支持flashWhen it comes to selling your old digital equipment you usually should wipe it of all digital traces with something like DBAN, however if you can’t there are some precautions you should take–here’s one related to Flash content you may h…

博客在线——Wireshark基本用法

http://blog.jobbole.com/ http://blog.jobbole.com/70907/转载于:https://www.cnblogs.com/zhongbokun/p/9709326.html

绘制三维散点图_SPSS统计作图教程:三维散点图

作者&#xff1a;豆沙包&#xff1b;审稿&#xff1a;张耀文1、问题与数据最大携氧能力是身体健康的一项重要指标&#xff0c;但检测该指标成本较高。研究者想根据性别、年龄、体重、运动后心率等指标建立预测最大携氧能力的模型&#xff0c;招募了100名研究对象&#xff0c;测…

【Python】插入sqlite数据库

import sqlite3 from datetime import datetimeconn sqlite3.connect(data.db) print("Opened database successfully")for i in range(100):time datetime.now()conn.execute("INSERT INTO test(time,url,imgPath) VALUES (?,?,?)", (time, "ww…

java数组转list(Arrays .asList)

习惯性的错误代码&#xff1a; Integer[] intArr {1,2,3}; List<Integer> lst Arrays .asList(intArr); lst.add(4); 报UnsupportedOperationException异常&#xff0c;原因是Arrays .asList() 返回的固定大小的列表&#xff0c;无法进行add、remove等操作&#xff1b;…

使用lodash防抖_什么,lodash 的防抖失效了?

戳蓝字「前端技术优选」关注我们哦&#xff01;作者&#xff1a;yeyan1996https://juejin.im/post/6892577964458770445应某人的要求被迫营业&#xff0c;望各位看官不要吝啬手中的赞-。-背景在使用 uni-app 开发小程序时&#xff0c;有个填写表单的需求&#xff0c;包含两个输…

Ubuntu 12.10中的8个新功能,Quantal Quetzal

Ubuntu 12.10 has been released and you can download it now. From better integration with web apps and online services to improvements in Unity, there are quite a few changes – although none of them are huge or groundbreaking. Ubuntu 12.10已发布&#xff0c…

背单词APP调研分析

前言&#xff1a;随着我国网络经济重心向移动端的转移&#xff0c;移动教育领域获得的关注度在持续放大。互联网的发展和移动设备的普及&#xff0c;我们开始在移动设备上学习&#xff0c;各种学习教育软件如雨后春笋&#xff0c;越来越多&#xff0c;就背单词软件来说&#xf…