代碼隨想錄第二十天|二叉樹part08--669.修建二叉搜索樹、108.將有序數組轉換為二叉搜索樹、538.把二叉搜索樹轉換為累加樹

刷題小記:

上期學習了二叉搜索樹的插入和刪除操作,這次學習如何按區間修剪二叉搜索樹。還有兩題,關于借助二叉搜索樹的有序特性進行轉換。

669.修剪二叉搜索樹(669.修剪二叉搜索樹)

題目分析:

給定一個二叉搜索樹的根節點root,以及最小邊界low和最大邊界high,通過修建二叉搜索樹,使得所有節點的值在[low, high]之中。并保證不改變保留在樹中元素的相對結構。

解題思路:

在450.刪除二叉搜索樹中的節點一題中,我們已經研究了二叉搜索樹節點的刪除方式,在此題之中,我們同樣也面臨節點刪除的情況,結合情景進一步分析如下:

  • 小于下邊界的節點,其左子樹必然全部出界,均需剪枝;
  • 大于上邊界的節點,其右子樹必然全部出界,均需剪枝。

只需反復運用這兩條法制,并遍歷整棵樹,能夠確保結果正確。

解題步驟:

考慮使用前序遍歷的遞歸解決:

  • 遞歸的參數:當前節點,下界,上界
  • 遞歸的返回值:修剪后的當前節點所在子樹的根節點
  • 遞歸的終止條件:遇到空節點,返回null
  • 遞歸的單層遞歸邏輯:
    • 對于當前節點cur,如果cur.val<low,那么遞歸cur的右子樹的修剪結果并直接返回
    • 對于當前節點cur,如果cur.val>high,那么遞歸cur的左孩子的修剪結果并直接返回
    • 遞歸修剪cur的左孩子
    • 遞歸修剪cur的右孩子
    • 返回修剪完畢的cur
class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if (root == null) return null;if (root.val < low) return trimBST(root.right, low, high);// 相當于將包含該節點在內的左半部分全部剪枝,用其右子樹的修剪結果直接替代該節點if (root.val > high) return trimBST(root.left, low, high);// 相當于將包含該節點在內的右半部分全部剪枝,用其左子樹的修剪結果直接替代該節點root.left = trimBST(root.left, low, high);// 修剪該節點左子樹root.right = trimBST(root.right, low, high);// 修剪該節點右子樹return root;}
}

108.將有序數組轉換為二叉搜索樹(108.將有序數組轉換為二叉搜索樹)

題目分析:

給定一個升序排列的整數數組nums,需將其轉換成一棵平衡二叉搜索樹(左右子樹相差高度不超過1)。

解題重點:

構造方式:

觀察題目示例發現,構造方式存在左傾式和右傾式兩種。

左傾式:以大者為父節點,小者為左孩子節點。

右傾式:以小者為父節點,大者為右孩子節點。

此處我默認選擇左傾式進行構造。

轉換方式:

觀察完構造方式,再來觀察如何進行轉換。

給定nums數組(包括過程中的子數組),要么長度為奇,要么為偶。

  • 若為奇數組,則中間值為當前子樹的根節點,以中間值(下標為n/2)為界的左子數組轉換成左子樹,右子數組轉換成右子樹
  • 若為偶數組,由于先前采用了左傾式的構造方式(與奇數組情況統一),此處選擇以下標為n/2處為中間值(數組長為n),則中間值為當前子樹的根節點,以中間值為界的左子數組轉換成左子樹,右子數組轉換成右子樹

解題步驟:

構造前序遍歷的遞歸函數traversal如下:

  • 遞歸的參數:轉換數組nums,左邊界下標left,右邊界下標right(左閉右閉)
  • 遞歸的返回值:轉換后所得子樹的根節點root
  • 遞歸的終止條件:left > right時,返回空節點null
  • 遞歸的單層遞歸邏輯:
    • 取mid = (right + left + 1) / 2,用下標為mid的值構造當前子樹的根節點root
    • 用new_left = left,new_right = mid - 1的區間構造左子樹
    • 用new_left = mid + 1,new_right = rigt的區間構造右子樹
    • 最終返回root。
class Solution {public TreeNode sortedArrayToBST(int[] nums) {return traversal(nums, 0, nums.length - 1);}public TreeNode traversal(int[] nums, int left, int right) {if (left > right) return null;int mid = (right + left + 1) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = traversal(nums, left, mid - 1);root.right = traversal(nums, mid + 1, right);return root;}
}

538.把二叉搜索樹轉換為累加樹(538.把二叉搜索樹轉換為累加樹)

題目分析:

給出一棵二叉搜索樹的根節點root,該樹的節點值均不相同,現要求將其轉換成累加樹——每個節點值的新值等于原樹中大于等于原值的值之和。

解題思路:

大于等于原值的值,除自身的值相等外,無其他相等的值;而大于原值的其他值,出現在該值的“右側”,根據二叉搜索樹的特性,這個“右側”描述為:該節點的最左祖先節點x,其父節點x_dad和x_dad的右子樹的全部節點。

可知,欲將二叉搜索樹轉換成這種累加樹,應當從原樹的右下方開始運算,即右中左的順序,即倒序的中序遍歷,在該遍歷順序下,每一個中節點的值更改為原節點值+前綴節點值。

解題步驟:

采用右中左的遍歷順序,構造遞歸函數:

  • 遞歸的參數:當前節點root
  • 遞歸的返回值:更改后的節點
  • 遞歸的終止條件:遇到空節點,返回null
  • 遞歸的單層遞歸邏輯:
    • 向右遞歸,更新累加后的“右節點”
    • 若前綴節點pre不為空,則更新當前節點值累加上前綴節點pre的值,并更新前綴節點pre
    • 向左遞歸,更新累加后的“左節點”
    • 返回root
class Solution {TreeNode pre = null;public TreeNode convertBST(TreeNode root) {if (root == null) return root;root.right = convertBST(root.right);if (pre != null) root.val += pre.val;pre = root;root.left = convertBST(root.left);return root;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71849.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71849.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Fisher信息矩陣(Fisher Information Matrix,簡稱FIM)

Fisher信息矩陣簡介 Fisher信息矩陣&#xff08;Fisher Information Matrix&#xff0c;簡稱FIM&#xff09;是統計學和信息理論中的一個重要概念&#xff0c;廣泛應用于參數估計、統計推斷和機器學習領域。它以統計學家羅納德費希爾&#xff08;Ronald Fisher&#xff09;的名…

【初階數據結構】鏈表的柔光之美

目錄 一、為什么需要鏈表&#xff1f; 二、鏈表與數組的對比 三、鏈表節點定義 四、鏈表基本操作 1. 創建鏈表 2. 插入節點 頭插法&#xff08;時間復雜度O(1)&#xff09; 尾插法&#xff08;時間復雜度O(n)&#xff09; 3. 刪除節點 4. 遍歷鏈表 五、進階操作 1. 反…

《論湖倉一體架構及其應用》審題技巧 - 系統架構設計師

軟考論文寫作框架 一、考點概述 “湖倉一體架構及其應用”這一論題&#xff0c;主要考察了考生對現代數據管理系統中湖倉一體架構的理解、應用及問題解決能力。隨著5G、大數據、人工智能、物聯網等技術的快速發展&#xff0c;企業數據的管理需求正發生深刻變化。傳統的數據管…

MybatisPlus-擴展功能-枚舉處理器

在Mybatis里有一個叫TypeHandler的類型處理器&#xff0c;我們常見的PO當中的這些成員變量的數據類型&#xff0c;它都有對應的處理器&#xff0c;因此它就能自動實現這些Java數據類型與數據庫類型的相互轉換。 它里面還有一個叫EnumOrdinalTypeHandler的枚舉處理器&#xff0…

北京大學第二彈《DeepSeek提示詞工程和落地場景》

大家好&#xff0c;我是吾鳴。 之前給大家分享過北京大學出品的DeepSeek教程《DeepSeek與AIGC應用》&#xff0c;今天吾鳴發現北京大學又出第二版教程了&#xff0c;教程的名稱叫做《DeepSeek提示詞工程和落地場景》&#xff0c;在此分享給大家。文末有完整版PDF下載地址。 教程…

deepseek自動化代碼生成

使用流程 效果第一步&#xff1a;注冊生成各種大模型的API第二步&#xff1a;注冊成功后生成API第三步&#xff1a;下載vscode在vscode中下載agent&#xff0c;這里推薦使用cline 第四步&#xff1a;安裝完成后&#xff0c;設置模型信息第一步選擇API provider&#xff1a; Ope…

322.零錢兌換

class Solution(object):def coinChange(self, coins, amount):""":type coins: List[int]:type amount: int:rtype: int"""n len(coins) dp [float(inf)]*(amount 1) # 初始值為正無窮大dp[0] 0 # 一定要初始化為0if amount 0:return 0 …

ARM Cortex-M處理器中的MSP和PSP

在ARM Cortex-M系列處理器中&#xff0c;MSP&#xff08;主堆棧指針&#xff09;和PSP&#xff08;進程堆棧指針&#xff09;是兩種不同的堆棧指針&#xff0c;主要用于實現堆棧隔離和提升系統可靠性。以下是它們的核心區別和應用場景&#xff1a; 1. 基本定義 MSP&#xff08;…

交換機與路由器連接方式

交換機和路由器連接的三種主要方式如下&#xff1a; 一、直連連接 這是最簡單直接的連接方式。通過一根網線將交換機的一個端口與路由器的一個LAN端口相連。這種連接方式適用于小型網絡&#xff0c;其中交換機負責局域網內部的數據交換&#xff0c;而路由器則負責將內部網絡連接…

Python代碼片段-Excel導入到MongoDB

有一次遇到一個需求&#xff0c;需要把Excel的數據導入到MongoDB中&#xff0c;表面上感覺就是導入數據很簡單&#xff0c;但實際操作后&#xff0c;發現是比較麻煩的一個事情&#xff0c;一般圖形化的工具對于MongoDB而言&#xff0c;導入選項都是json的&#xff0c;根本沒有E…

axios幾種請求類型的格式

Axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;廣泛用于瀏覽器和 Node.js 中發送 HTTP 請求。它支持多種請求格式&#xff0c;包括 GET、POST、PUT、DELETE 等。也叫RESTful 目錄 一、axios幾種請求類型的格式 1、get請求 2、post請求 3、put請求 4、delete請求 二…

手寫系列——MoE網絡

參考&#xff1a; MOE原理解釋及從零實現一個MOE&#xff08;專家混合模型&#xff09;_moe代碼-CSDN博客 MoE環游記&#xff1a;1、從幾何意義出發 - 科學空間|Scientific Spaces 深度學習之圖像分類&#xff08;二十八&#xff09;-- Sparse-MLP(MoE)網絡詳解_sparse moe…

Linux的基礎指令和環境部署,項目部署實戰(下)

目錄 上一篇&#xff1a;Linxu的基礎指令和環境部署&#xff0c;項目部署實戰&#xff08;上&#xff09;-CSDN博客 1. 搭建Java部署環境 1.1 apt apt常用命令 列出所有的軟件包 更新軟件包數據庫 安裝軟件包 移除軟件包 1.2 JDK 1.2.1. 更新 1.2.2. 安裝openjdk&am…

【藍橋杯】第十五屆省賽大學真題組真題解析

【藍橋杯】第十五屆省賽大學真題組真題解析 一、智能停車系統 1、知識點 &#xff08;1&#xff09;flex-wrap 控制子元素的換行方式 屬性值有&#xff1a; no-wrap不換行wrap伸縮容器不夠則自動往下換行wrap-reverse伸縮容器不夠則自動往上換行 &#xff08;2&#xff0…

flink operator v1.10對接華為云對象存儲OBS

1 概述 flink operator及其flink集群&#xff0c;默認不直接支持華為云OBS&#xff0c;需要在這些java程序的插件目錄放一個jar包&#xff0c;以及修改flink配置后&#xff0c;才能支持集成華為云OBS。 相關鏈接參考&#xff1a; https://support.huaweicloud.com/bestpracti…

免費PDF工具

Smallpdf.com - A Free Solution to all your PDF Problems Smallpdf - the platform that makes it super easy to convert and edit all your PDF files. Solving all your PDF problems in one place - and yes, free. https://smallpdf.com/#rappSmallpdf.com-解決您所有PD…

去中心化技術P2P框架

中心化網絡與去中心化網絡 1. 中心化網絡 在傳統的中心化網絡中&#xff0c;所有客戶端都通過一個中心服務器進行通信。這種網絡拓撲結構通常是一個星型結構&#xff0c;其中服務器作為中心節點&#xff0c;每個客戶端只能與服務器通信。如果客戶端之間需要通信&#xff0c;必須…

muduo源碼閱讀:linux timefd定時器

?timerfd timerfd 是Linux一個定時器接口&#xff0c;它基于文件描述符工作&#xff0c;并通過該文件描述符的可讀事件進行超時通知。可以方便地與select、poll和epoll等I/O多路復用機制集成&#xff0c;從而在沒有處理事件時阻塞程序執行&#xff0c;實現高效的零輪詢編程模…

Pinia 3.0 正式發布:全面擁抱 Vue 3 生態,升級指南與實戰教程

一、重大版本更新解析 2024年2月11日&#xff0c;Vue 官方推薦的狀態管理庫 Pinia 迎來 3.0 正式版發布&#xff0c;本次更新標志著其全面轉向 Vue 3 技術生態。以下是開發者需要重點關注的升級要點&#xff1a; 1.1 核心變更說明 特性3.0 版本要求兼容性說明Vue 支持Vue 3.…

【圖像處理 --- Sobel 邊緣檢測的詳解】

Sobel 邊緣檢測的詳解 目錄 Sobel 邊緣檢測的詳解1. 梯度計算2. 梯度大小3. 梯度方向4. 非極大值抑制5. 雙閾值處理6. 在 MATLAB 中實現 Sobel 邊緣檢測7.運行結果展示8.關鍵參數解釋9.實驗與驗證 Sobel 邊緣檢測是一種經典的圖像處理算法&#xff0c;用于檢測圖像中的邊緣。它…