leetcode--恢复二叉搜索树

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

示例 1:
在这里插入图片描述

输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 的左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。
示例 2:
在这里插入图片描述

输入: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

实现思路

这个问题要求恢复一个二叉搜索树,其中恰好有两个节点的值被错误地交换了,但是不改变其结构。二叉搜索树的特性是左子树的所有节点小于根节点,右子树的所有节点大于根节点。

中序遍历
二叉搜索树进行中序遍历得到的序列应该是递增的。如果有两个节点交换了位置,会导致中序遍历序列中出现一对不满足递增关系的节点。
寻找错误节点
在中序遍历过程中,记录前驱节点和当前节点。
如果出现前驱节点的值大于当前节点的值,则这两个节点是需要交换的节点。
恢复节点
如果发现了需要交换的节点,记录下来。
最后交换这两个节点的值,使得树恢复为二叉搜索树的结构。

代码详解

# Definition for a binary tree node.
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef recoverTree(root: TreeNode) -> None:x = y = prev = Nonedef inorder(node):nonlocal x, y, previf not node:returninorder(node.left)if prev and prev.val >= node.val:if x is None:x = prevy = nodeprev = nodeinorder(node.right)inorder(root)x.val, y.val = y.val, x.val# Helper function to print inorder traversal
def print_inorder(root):if not root:returnprint_inorder(root.left)print(root.val, end=" ")print_inorder(root.right)# Example usage:
# Example 1: [1,3,null,null,2]
root1 = TreeNode(1)
root1.right = TreeNode(3)
root1.right.left = TreeNode(2)print("Before recovery:")
print_inorder(root1)
print()recoverTree(root1)print("After recovery:")
print_inorder(root1)

go实现

package mainimport "fmt"type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}func recoverTree(root *TreeNode) {var x, y, prev *TreeNodevar inorder func(*TreeNode)inorder = func(node *TreeNode) {if node == nil {return}inorder(node.Left)if prev != nil && prev.Val >= node.Val {if x == nil {x = prev}y = node}prev = nodeinorder(node.Right)}inorder(root)x.Val, y.Val = y.Val, x.Val
}// Helper function to print inorder traversal
func printInorder(root *TreeNode) {if root == nil {return}printInorder(root.Left)fmt.Printf("%d ", root.Val)printInorder(root.Right)
}func main() {// Example 1: [1,3,null,null,2]root := &TreeNode{Val: 1}root.Right = &TreeNode{Val: 3}root.Right.Left = &TreeNode{Val: 2}fmt.Println("Before recovery:")printInorder(root)fmt.Println()recoverTree(root)fmt.Println("After recovery:")printInorder(root)
}

kotlin实现

class TreeNode(var `val`: Int) {var left: TreeNode? = nullvar right: TreeNode? = null
}fun recoverTree(root: TreeNode?) {var x: TreeNode? = nullvar y: TreeNode? = nullvar prev: TreeNode? = nullfun inorder(node: TreeNode?) {if (node == null) returninorder(node.left)if (prev != null && prev!!.`val` >= node.`val`) {if (x == null) {x = prev}y = node}prev = nodeinorder(node.right)}inorder(root)// Swap the values of x and yval temp = x!!.`val`x!!.`val` = y!!.`val`y!!.`val` = temp
}// Helper function to print the tree in-order
fun printInOrder(node: TreeNode?) {if (node == null) returnprintInOrder(node.left)print("${node.`val`} ")printInOrder(node.right)
}fun main() {// Example 1: [1,3,null,null,2]val root1 = TreeNode(1)root1.right = TreeNode(3)root1.right!!.left = TreeNode(2)println("Before recovery:")printInOrder(root1)println()recoverTree(root1)println("After recovery:")printInOrder(root1)println()
}

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

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

相关文章

AirPods Pro新功能前瞻:iOS 18的五大创新亮点

随着科技的不断进步&#xff0c;苹果公司一直在探索如何通过创新提升用户体验。iOS 18的推出&#xff0c;不仅仅是iPhone的一次系统更新&#xff0c;更是苹果生态链中重要一环——AirPods Pro的一次重大升级。 据悉&#xff0c;iOS 18将为AirPods Pro带来五项新功能&#xff0…

设计模式探索:观察者模式

1. 观察者模式 1.1 什么是观察者模式 观察者模式用于建立一种对象与对象之间的依赖关系&#xff0c;当一个对象发生改变时将自动通知其他对象&#xff0c;其他对象会相应地作出反应。 在观察者模式中有如下角色&#xff1a; Subject&#xff08;抽象主题/被观察者&#xf…

【大模型】大规模部署LLM:挑战与对策

大规模部署LLM&#xff1a;挑战与对策 引言一、计算资源的挑战1.1 计算成本1.2 能源消耗与碳足迹 二、维护与更新的挑战2.1 模型更新与版本控制2.2 知识时效性 三、数据隐私与伦理考量3.1 数据隐私保护3.2 伦理与偏见 四、可扩展性与灵活性4.1 系统架构设计4.2 多语言与地域适应…

详细分析@FunctionalInterface的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;Spring框架从入门到学精&#xff08;全&#xff09; 1. 基本知识 FunctionalInterface 是 Java 8 引入的一个注…

外卖商城平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;骑手管理&#xff0c;商品类型管理&#xff0c;商品信息管理&#xff0c;订单信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#…

【AI资讯早报】AI科技前沿资讯概览:2024年7月10日早报

AI科技前沿资讯概览&#xff0c;涵盖了行业大会、技术创新、应用场景、行业动态等多个方面&#xff0c;全面展现了AI领域的最新发展动态和未来趋势。 一、人工智能大模型引领新业态 在2024年&#xff08;第二十三届&#xff09;中国互联网大会上&#xff0c;中国工程院院士邬贺…

模板初阶详解

目录 泛型编程函数模板函数模板概念函数模板格式函数模板的原理函数模板的实例化隐式实例化强制类型转换的疑惑 显式实例化 模板参数的匹配原则 类模板类模板的定义格式类模板的实例化 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f41…

微信小程序接口wx.getLocation违规导致封禁解决办法

1、找到站内信的这个封禁的通知&#xff08;功能封禁的通知&#xff0c;而不是处理警告的通知&#xff09; 2、点击通知会有申诉链接&#xff0c;点开申诉链接 申诉原因可参考下面的内容&#xff1a; 1.小程序哪些板块已除去收集地理位置、2.哪些板块需要收集地理位置、3.详细…

宝塔内 计划任务更新远程主机的时间

很多情况下一些主机无法上网,长此以往有可能让系统内的时间混乱 ,这是一个很愁人的事情 这里我们找了一个可以通过宝塔的计划任务或 cron 不断将本地时间通过ssh登录,并在登录状态下设置时间的方法.找了很多方案都不行 .最终采用了私钥登录的方案 1 使用宝塔的计划任务(可选): …

WindowsMac共享文件夹设置

共享文件夹设置 共享文件夹设置Windows系统设置步骤一&#xff1a;设置共享文件夹步骤二: 访问共享文件夹 Mac系统中设置共享文件夹步骤一&#xff1a;设置共享文件夹步骤二&#xff1a;访问共享文件夹 小贴士结论 共享文件夹设置 有时需要在多台电脑之间共享文件夹&#xff0…

4.MkDocs样式

学习 Admonitions(警告) - Material for MkDocs (wdk-docs.github.io) 提示 - Material for MkDocs 中文文档 (llango.com) Buttons(按钮) - Material for MkDocs (wdk-docs.github.io) 建议去看这些网站&#xff0c;更为详细。 常用功能 便利贴 ​​ 开启 markdown_ex…

Linux笔记之iftop查看特定IP地址吞吐量

Linux笔记之iftop查看特定IP地址吞吐量 code review! 文章目录 Linux笔记之iftop查看特定IP地址吞吐量一.iftop安装与监控二.iftop 界面简单介绍如何查看单位实时流量的显示形式控制单位显示示例 三.数据存储和传输的单位&#xff1a;比特&#xff08;bit&#xff09;和字节&…

Gemma2——Google 新开源大型语言模型完整应用指南

0.引言 Gemma 2以前代产品为基础&#xff0c;提供增强的性能和效率&#xff0c;以及一系列创新功能&#xff0c;使其在研究和实际应用中都具有特别的吸引力。Gemma 2 的与众不同之处在于&#xff0c;它能够提供与更大的专有模型相当的性能&#xff0c;但其软件包专为更广泛的可…

hdfs大规模数据存储底层原理详解(第31天)

系列文章目录 一、HDFS设计原理 二、HDFS系统架构 三、HDFS关键技术 四、HDFS应用实例 五、解决HDFS不能处理小文件详解问题 文章目录 系列文章目录前言一、设计原理二、系统架构三、关键技术四、应用实例五、解决HDFS不能处理小文件详解问题1. 合并小文件2. 优化Hive配置3. 使…

DDR3 SO-DIMM 内存条硬件总结(一)

最近在使用fpga读写DDR3&#xff0c;板子上的DDR3有两种形式与fpga相连&#xff0c;一种是直接用ddr3内存颗粒&#xff0c;另一种是通过内存条的形式与fpga相连。这里我们正好记录下和ddr3相关的知识&#xff0c;先从DDR3 SO-DIMM 内存条开始。 1.先看内存条的版本 从JEDEC下载…

Mysql练习题目【7月10日更新】

七、Mysql练习题目 https://zhuanlan.zhihu.com/p/38354000 1. 创建表 创建学生表 mysql> create table if not exists student(-> student_id varchar(255) not null,-> student_name varchar(255) not null,-> birthday date not null,-> gender varchar(…

前端面试题33(实时消息传输)

前端实时传输协议主要用于实现实时数据交换&#xff0c;特别是在Web应用中&#xff0c;它们让开发者能够构建具有实时功能的应用&#xff0c;如聊天、在线协作、游戏等。以下是几种常见的前端实时传输协议的讲解&#xff1a; 1. Short Polling (短轮询) 原理&#xff1a;客户…

【1】A-Frame整体介绍

1.A-Frame是什么&#xff1f; A-Frame 是一个用于构建虚拟现实 (VR) 体验的 Web 框架。 A-Frame 基于 HTML 之上&#xff0c;因此上手简单。但 A-Frame 不仅仅是 3D 场景图或标记语言&#xff1b;它还是一种标记语言。其核心是一个强大的实体组件框架&#xff0c;为 Three.js …

Golang | Leetcode Golang题解之第226题翻转二叉树

题目&#xff1a; 题解&#xff1a; func invertTree(root *TreeNode) *TreeNode {if root nil {return nil}left : invertTree(root.Left)right : invertTree(root.Right)root.Left rightroot.Right leftreturn root }

AI机器人在未来的应用场景预测:是否会取代人类?华为、百度、特斯拉他们在AI领域都在做什么?

引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI机器人在各个领域的应用变得越来越普遍。从工业自动化到日常生活&#xff0c;AI机器人已经开始展现出强大的潜力和实际应用价值。本文将深入探讨AI机器人在未来的应用场景&#xff0c;并分析它们是否…