恢复二叉搜索树

news/2024/12/22 20:49:54/

题目

给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。

进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?

示例 1:

image

输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。

示例 2:

image

输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。

提示:

  • 树上节点的数目在范围 [2, 1000] 内
  • -231 <= Node.val <= 231 - 1

参考答案

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

http://www.ppmy.cn/news/1513989.html

相关文章

【STM32 Blue Pill编程】-读取数字引脚输入

读取数字引脚输入 文章目录 读取数字引脚输入1、STM32的GPIO端口介绍2、程序运行逻辑3、硬件准备及接线4、GPIO配置5、代码实现在本文中,将介绍 STM32 Blue Pill 板的输入/输出 GPIO 引脚,并学习如何使用STM32的GPIO引脚作为输出引脚以及输入引脚。 1、STM32的GPIO端口介绍 …

ubuntu右上角没有小键盘图标

这个比较奇怪&#xff0c;一开始好好的&#xff0c;用着用着就不行了。网上解决方案比较多&#xff0c;大多数能解决一部分问题。 1.设置“输入法系统” 2.在终端运行 sudo killall ibus-daemon&#xff08;结束进程&#xff09; bus-daemon -d&#xff08;重启ibus&#xff0…

Excel求和方法之

一 SUM&#xff08;&#xff09;&#xff0c;选择要相加的数,回车即可 二 上面的方法还不够快。用下面这个 就成功了 三 还有一种一样快的 选中之后&#xff0c;按下Alt键和键&#xff08;即Alt&#xff09;

java 项目 idea 构建总是报内存溢出怎么解决

Java项目在IDEA中构建时报内存溢出通常是由于JVM堆内存不足导致的。以下是几种解决方法&#xff1a; 增加IDEA的内存分配&#xff1a; 打开 Help -> Edit Custom VM Options添加或修改以下行&#xff1a;-Xmx2048m -XX:MaxPermSize512m其中-Xmx后面的数值可以根据你的电脑内…

数据库中vip什么意思

数据库中VIP是指虚拟IP地址&#xff08;Virtual IP Address&#xff09;。VIP用于实现高可用性、负载均衡、容错功能。 VIP的实现依赖于网络接口的虚拟化&#xff0c;允许多个主机共享一个IP地址。这个虚拟IP通常配置在数据库集群中&#xff0c;确保即使某个节点出现故障&…

sh脚本中执行php,让sh抛出php的异常

首先&#xff0c;假设你有一个 PHP 脚本 test.php&#xff0c;它可能会抛出一个异常&#xff1a; <?php throw new Exception("这是一个异常");然后&#xff0c;你可以写一个 shell 脚本 run_php.sh 来执行这个 PHP 脚本并捕获异常&#xff1a; # php 抛出异…

DOM型xss靶场实验

xss是什么&#xff1f; XSS是一种经常出现在web应用中的计算机安全漏洞&#xff0c;它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制--例如同源策略(same origin policy)。这种类型的漏洞由…

[alien Invasion]python小游戏阶段总结

以后可能还会进行代码重构&#xff0c;以最终版本为准 本篇文章旨在理清程序脉络&#xff0c;方便以后写类似的程序时提供一个习惯的思路 未经允许&#xff0c;禁止转载 实体区 ship.py import pygame class Ship():def __init__(self,screen,ai_settings):#储存以便后续使…