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.pswp.cn/diannao/44094.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44094.shtml
英文地址,請注明出處:http://en.pswp.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;并分析它們是否…