[Leetcode][第99题][JAVA][恢复二叉搜索树][中序遍历]

【问题描述】[困难]

在这里插入图片描述

【解答思路】

1. 显示中序遍历

在这里插入图片描述

时间复杂度:O(N) 空间复杂度:O(N)

class Solution {public void recoverTree(TreeNode root) {List<Integer> nums = new ArrayList<Integer>();inorder(root, nums);int[] swapped = findTwoSwapped(nums);recover(root, 2, swapped[0], swapped[1]);}public void inorder(TreeNode root, List<Integer> nums) {if (root == null) {return;}inorder(root.left, nums);nums.add(root.val);inorder(root.right, nums);}public int[] findTwoSwapped(List<Integer> nums) {int n = nums.size();//第一次找到取前面 第二次找到取后面int x = -1, y = -1;for (int i = 0; i < n - 1; ++i) {if (nums.get(i + 1) < nums.get(i)) {y = nums.get(i + 1);if (x == -1) {x = nums.get(i);} else {break;}}}return new int[]{x, y};}public void recover(TreeNode root, int count, int x, int y) {if (root != null) {if (root.val == x || root.val == y) {root.val = root.val == x ? y : x;if (--count == 0) {return;}}recover(root.right, count, x, y);recover(root.left, count, x, y);}}
}
2. 隐式中序遍历 栈

在这里插入图片描述
在这里插入图片描述

时间复杂度:O(N) 空间复杂度:O(H)
在这里插入图片描述

class Solution {public void recoverTree(TreeNode root) {Deque<TreeNode> stack = new ArrayDeque<TreeNode>();TreeNode x = null, y = null, pred = null;while (!stack.isEmpty() || root != null) {while (root != null) {stack.push(root);root = root.left;}root = stack.pop();if (pred != null && root.val < pred.val) {y = root;if (x == null) {x = pred;} else {break;}}pred = root;root = root.right;}swap(x, y);}public void swap(TreeNode x, TreeNode y) {int tmp = x.val;x.val = y.val;y.val = tmp;}
}
3. Morris 中序遍历

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

时间复杂度:O(N) 空间复杂度:O(1)
在这里插入图片描述

class Solution {public void recoverTree(TreeNode root) {TreeNode x = null, y = null, pred = null, predecessor = null;while (root != null) {if (root.left != null) {// predecessor 节点就是当前 root 节点向左走一步,然后一直向右走至无法走为止predecessor = root.left;while (predecessor.right != null && predecessor.right != root) {predecessor = predecessor.right;}// 让 predecessor 的右指针指向 root,继续遍历左子树if (predecessor.right == null) {predecessor.right = root;root = root.left;}// 说明左子树已经访问完了,我们需要断开链接else {if (pred != null && root.val < pred.val) {y = root;if (x == null) {x = pred;}}pred = root;predecessor.right = null;root = root.right;}}// 如果没有左孩子,则直接访问右孩子else {if (pred != null && root.val < pred.val) {y = root;if (x == null) {x = pred;}}pred = root;root = root.right;}}swap(x, y);}public void swap(TreeNode x, TreeNode y) {int tmp = x.val;x.val = y.val;y.val = tmp;}
}

【总结】

1. 交换的思想

两个指针或两个标志找逆序

2. 二叉搜索树 中序遍历 单调递增
3.空间复杂度优化 Morris 中序遍历优化 空间复杂度:O(1)

转载链接:https://leetcode-cn.com/problems/recover-binary-search-tree/solution/hui-fu-er-cha-sou-suo-shu-by-leetcode-solution/

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

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

相关文章

复盘二进制的习题(2)

338 Counting Bits。输入一个整数n&#xff0c;对于 0 ≤ i ≤ num&#xff0c;计算每个数的二进制1的个数。例如&#xff1a;num 5 返回 [0,1,1,2,1,2]。希望能在O(n)的时间内完成。这里有动态规划的思想。 思路一&#xff1a; 十进制数二进制表示0000010011(0的bits)20101…

c#XML的基本使用

创建XML文档 static void Main(string[] args){//1.引入命名空间//2.创建XML文档对象XmlDocument xmldoc new XmlDocument();//3.创建第一行描述信息&#xff0c;添加到xmldoc文档中XmlDeclaration xmldec xmldoc.CreateXmlDeclaration("1.0", "utf-8", …

第四十一期:深度解析5G核心网建设难点和挑战

目前核心网处于架构转型和业务转型的关键期。在架构层面&#xff0c;NFV、CU分离、边缘计算等技术的成熟推动核心网络架构转型&#xff0c;控制面进一步集中&#xff0c;转发面进一步下沉。 目前核心网处于架构转型和业务转型的关键期。在架构层面&#xff0c;NFV、CU分离、边缘…

linux 进入一个中文乱码的目录的方法

bash命令&#xff1a;cd ls | awk NRxxx awk命令&#xff1a;获取第xxx行的目录名称&#xff0c;加上NR表示从第一行开始读的行号取 NR已经读出的记录数&#xff0c;就是行号&#xff0c;从1开始 用|把ls的结果传给后面的awk命令&#xff0c;连接上前面的cd就能进入啦 导引号…

[Leetcode][第696题][JAVA][计算二进制子串][分组]

【问题描述】[简单] 【解答思路】 1. 按字符分组 将字符串 ss 按照 00 和 11 的连续段分组&#xff0c;存在counts 数组中&#xff0c;例如 s 00111011&#xff0c;可以得到这样的counts 数组&#xff1a;counts{2,3,1,2}。 这里counts 数组中两个相邻的数一定代表的是两种…

第五章数理统计--样本和抽样分布

从今天开始要学习数理统计。 概率论&#xff1a;是专门研究随机现象的一门学科&#xff0c;定量描述随机现象及其规律。 数理统计&#xff1a;数理统计的研究对象是数据&#xff0c;包括对数据的采集、整理、分析、建模。主要任务是获取样本、描述样本&#xff0c;从样本得到…

Scrapy安装报错

python3 pip 安装Scrapy在win10 安装报错error: Microsoft Visual C 14.0 is required. Get it with "Microsoft Visual C Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools 问题描述 当前环境win10&#xff0c;python_3.6.1&#xff0c;64…

第四十三期:2020年企业面临的20大数据安全风险

为了帮助企业为日益增长的确定性风险做好准备&#xff0c;以下我们总结了企业2020年可能面临的20种数据安全风险。 如今&#xff0c;数据安全已成为公司、消费者和监管机构的头等大事。 近年来数据泄露和隐私事故越来越普遍&#xff0c;而且代价高昂。Risk Based Security的一…

[Leetcode][第93题][JAVA][复原IP地址][剪枝][回溯]

【问题描述】[中等] 【解答思路】 1. 递归 回溯剪枝 复杂度 class Solution {static final int SEG_COUNT 4;List<String> ans new ArrayList<String>();int[] segments new int[SEG_COUNT];public List<String> restoreIpAddresses(String s) {segmen…

函数嵌套

目录 一、函数的嵌套定义二、函数的嵌套调用一、函数的嵌套定义 函数内部定义的函数&#xff0c;无法在函数外部使用内部定义的函数。 def f1():def f2():print(from f2)f2()f2() # NameError: name f2 is not defined def f1():def f2():print(from f2)f2()f1() from f2 现在…

第六章 参数估计

依据样本推出总体分布的参数&#xff0c;方法有两种&#xff1a;矩估计和极大似然估计。  参数估计的形式有&#xff1a;点估计和区间估计。  点估计&#xff1a;构造合适的统计量θˆθˆ(X1,X2,...Xn)用来估计未知参数θ&#xff0c;θˆ称为参数θ的点估计量。  当给定…

第四十四期:1.3万亿条数据查询如何做到毫秒级响应?

知乎&#xff0c;在古典中文中意为“你知道吗?”&#xff0c;它是中国的 Quora&#xff0c;一个问答网站&#xff0c;其中各种问题由用户社区创建&#xff0c;回答&#xff0c;编辑和组织。 图片来自 Pexels 作为中国最大的知识共享平台&#xff0c;我们目前拥有 2.2 亿注册用…

Python拷贝梳理

python中存在与其他语言不同的概念&#xff0c;现在梳理一下相关概念。 其中 变量&#xff1a;拥有指向对象的连接空间&#xff0c;即引用空间的代称。 引用&#xff1a;指变量指向对象的指针。 对象&#xff1a;指变量声明后所产生的内存空间。 可变对象&#xff1a;表示…

sql一对多查询

子查询返回的值不止一个。当子查询跟随在 、!、<、<、>、> 之后&#xff0c;或子查询用作表达式时&#xff0c;这种情况是不允许的。 正确写法&#xff1a; select Material_Manage.MaterialNum,Material_Manage.MaterialName,Material_Manage.MaterialWeight,Mate…

[Leetcode][第130题][JAVA][被围绕的区域][DFS][BFS]

【问题描述】[中等] 【解答思路】 1. 深度优先搜索 使用深度优先搜索实现标记操作。在下面的代码中&#xff0c;我们把标记过的字母 O 修改为字母 A。 复杂度 class Solution {int[] dx {1, -1, 0, 0};int[] dy {0, 0, 1, -1};public void solve(char[][] board) {int n …

第四十五期:程序员未来干什么?做架构还是做管理?

很多程序员应该都会有这个疑问&#xff0c;尤其是工作经验不多的&#xff0c;对未来充满了期待。在我职业生涯的早期&#xff0c;比较偏重于走管理路线&#xff1b;现在呢&#xff0c;成了公司的架构师&#xff0c;当然也会承担一部分的管理工作。 很多程序员应该都会有这个疑问…

leetcode之回溯backtracing专题1

39 Combination Sum 给一组整数&#xff0c;给一个目标整数。从数组中任意选择几个数&#xff0c;这几个数的和等于目标整数。数组中每个数字可以选择多次。  例如given candidate set [2, 3, 6, 7] and target 7, 返回 [ [7], [2, 2, 3] ] 思路&#xff1a;数组candidat…

第十九期:HTTPS虐我千百遍,我却待她如初恋!

本篇将讨论 HTTPS 的加解密原理&#xff0c;很多人都知道 RSA&#xff0c;以为 HTTPSRSA&#xff0c;使用 RSA 加解密数据&#xff0c;实际上这是不对的。 图片来自 Pexels HTTPS 是使用 RSA 进行身份验证和交换密钥&#xff0c;然后再使用交换的密钥进行加解密数据。 身份验…

[Leetcode][第546题][JAVA][移除盒子][递归][动态规划]

【问题描述】[困难] 【解答思路】 1. 递归 动态规划 class Solution {public int removeBoxes(int[] boxes) {int[][][] dp new int[100][100][100];return calculatePoints(boxes, dp, 0, boxes.length - 1, 0);}public int calculatePoints(int[] boxes, int[][][] dp, int…

leetcode之回溯backtracing专题2

46 Permutations 输入一个不重复的数组 &#xff0c;写出这个数组的排列&#xff0c;不能重复。  例如 输入nums[1,2,3]&#xff0c;输出 [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路&#xff1a;可以看到 第0位&#xff08;从左开始数&#xff…