【算法訓練 day25 修剪二叉搜索樹、將有序數組轉化為二叉搜索樹、把二叉樹搜索轉化為累加樹】

目錄

  • 一、修剪二叉搜索樹-LeetCode 669
    • 思路
    • 實現代碼
      • 個人代碼
      • 視頻鏈接代碼
    • 個人問題
  • 二、將有序數組轉化為二叉搜索樹-LeetCode 108
    • 思路
    • 實現代碼
    • 個人問題
  • 三.把二叉樹搜索轉化為累加樹-LeeCode 538
    • 思路
    • 實現代碼
    • 個人問題


一、修剪二叉搜索樹-LeetCode 669

Leecode鏈接: leetcode 669
文章鏈接: 代碼隨想錄
視頻鏈接: B站

給你二叉搜索樹的根節點 root ,同時給定最小邊界low 和最大邊界 high。通過修剪二叉搜索樹,使得所有節點的值在[low, high]中。修剪樹 不應該 改變保留在樹中的元素的相對結構 (即,如果沒有被移除,原有的父代子代關系都應當保留)。 可以證明,存在 唯一的答案 。

示例:

輸入:root = [1,0,2], low = 1, high = 2
輸出:[1,null,2]

思路

這道題我跟視頻鏈接的思路稍微有點不一樣,我用的是后序遍歷。優先判斷左右子樹的狀態,如果左右子樹都為空,那么該節點就是葉子節點,根據自身值是否滿足區間要求返回空或者本身即可。如果不是葉子節點,那么需要對右子樹著重判斷,因為如果該節點值不滿足[low,high]區間,不代表該節點的右子樹值不滿足這個區間,如果滿足就返回右子樹的節點,否則返回空。

實現代碼

個人代碼

//cpp
class Solution {
public:TreeNode* test(TreeNode* root,int low,int high){if(root == nullptr)return root;root->left = test(root->left,low,high);root->right = test(root->right,low,high);if(root->val<low || root->val>high){//不滿足區間條件,根據左右子樹情況返回不同值if(root->left)return root->left;if(root->right)return root->right;if(root->right == nullptr) return nullptr;}return root;//滿足區間條件返回本身}TreeNode* trimBST(TreeNode* root, int low, int high) {return test(root,low,high);}
};

視頻鏈接代碼

//cpp
class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (root == nullptr ) return nullptr;if (root->val < low) {TreeNode* right = trimBST(root->right, low, high); // 尋找符合區間[low, high]的節點return right;}if (root->val > high) {TreeNode* left = trimBST(root->left, low, high); // 尋找符合區間[low, high]的節點return left;}root->left = trimBST(root->left, low, high); // root->left接入符合條件的左孩子root->right = trimBST(root->right, low, high); // root->right接入符合條件的右孩子return root;}
};

個人問題

沒有明顯問題,除了花的時間有點久。


二、將有序數組轉化為二叉搜索樹-LeetCode 108

Leecode鏈接: LeetCode 108
文章鏈接: 代碼隨想錄
視頻鏈接: B站

給你一個整數數組 nums ,其中元素已經按 升序 排列,請你將其轉換為一棵
平衡二叉搜索樹。

示例:

輸入:nums = [-10,-3,0,5,9]
輸出:[0,-3,9,-10,null,5]
解釋:[0,-10,5,null,-3,null,9] 也將被視為正確答案:

思路

數組是有序的,每次取數組中間值,然后將數組切割,左區間左子樹遞歸處理,右區間右子樹遞歸處理。

實現代碼

//cpp
class Solution {
public:TreeNode* build(vector<int>& nums,int left,int right){if(left>right){return nullptr;}int mid = (right - left)/2 + left;TreeNode* node = new TreeNode(nums[mid]);//取中間值作為父節點node->left = build(nums,left,mid - 1);node->right = build(nums,mid + 1,right);return node;}TreeNode* sortedArrayToBST(vector<int>& nums) {return build(nums,0,nums.size() - 1);}
};

個人問題

簡單題,無明顯問題。


三.把二叉樹搜索轉化為累加樹-LeeCode 538

Leecode鏈接: LeetCode 538
文章鏈接: 代碼隨想錄
視頻鏈接: B站

給出二叉 搜索 樹的根節點,該樹的節點值各不相同,請你將其轉換為累加樹(Greater Sum Tree),使每個節點 node 的新值等于原樹中大于或等于 node.val 的值之和。

示例:

輸入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
輸出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

思路

題目其實大意應該是使用右中左遍歷的順序來對節點值重新賦值,使用一個全局變量來保存累加和,然后遞歸處理每個節點即可,理清這個意思題目就基本知道怎么寫了。

實現代碼

//cpp
class Solution {
public:int sum = 0;void test(TreeNode* root){if(root == nullptr){return;}test(root->right);//右子樹sum = root->val + sum;//更新sum值root->val = sum;//重新賦值test(root->left);//左子樹return;}TreeNode* convertBST(TreeNode* root) {test(root);return root;}
};

個人問題

簡單題,無明顯問題。

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

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

相關文章

項目管理-計算題公式【復習】2/2

2.【成本】相關公式 2.1掙值分析 三個參數 &#xff08;1&#xff09;計劃價值(PV&#xff0c;Plan Value): PV&#xff1a;計劃工作分配的經批準的預算&#xff0c;是為完成某活動或 WBS 組成部分而準備的一份經批準的預算。不包括管理儲備。 注意&#xff1a;按照計劃截止目…

LwIP 之九 詳解 UDP RAW 編程、示例、API 源碼、數據流

我們最為熟知的網絡通信程序接口應該是 Socket。LwIP 自然也提供了 Socket 編程接口,不過,LwIP 的 Socket 編程接口都是使用最底層的接口來實現的。我們這里要學習的 UDP RAW 編程則是指的直接使用 LwIP 的最底層 UDP 接口來直接實現應用層功能。這里先來一張圖,對 LwIP 內部…

React 和 Vue兩個流行的前端 JavaScript 框架有什么區別?

設計理念&#xff1a; React 是由 Facebook 開發的&#xff0c;專注于構建 UI 組件。它采用了一種聲明式的、組件化的開發模式&#xff0c;通過使用虛擬 DOM 來實現高效的 UI 更新。 Vue 是由尤雨溪開發的&#xff0c;旨在提供一個靈活且易于上手的框架。Vue 也支持組件化開發…

電商技術揭秘營銷相關系列文章合集(4)

相關系列文章 電商技術揭秘相關系列文章合集&#xff08;1&#xff09; 電商技術揭秘相關系列文章合集&#xff08;2&#xff09; 電商技術揭秘相關系列文章合集&#xff08;3&#xff09; 文章目錄 引言集合說明集合文章列表 引言 在數字化浪潮的推動下&#xff0c;電商行…

【35分鐘掌握金融風控策略25】定額策略實戰2

目錄 基于收入和負債的定額策略 確定托底額度和蓋帽額度 確定基礎額度 基于客戶風險評級確定風險系數 計算最終授信額度 確定授信有效期 基于收入和負債的定額策略 在實際生產中&#xff0c;客戶的收入和負債數據大多無法直接獲得&#xff0c;對于個人的收入和負債數據&…

【JavaEE】Spring Boot 入門:快速構建你的第一個 Spring Boot 應用

目錄 第一個SpringBoot程序介紹項目創建創建項目目錄介紹輸出Hello World 第一個SpringBoot程序 介紹 在學習SpringBoot之前, 我們先來認識?下Spring 我們看下Spring官?(https://spring.io/)的介紹 可以看到, Spring讓Java程序更加快速, 簡單和安全. Spring對于速度、簡單…

【論文閱讀筆記】MapReduce: Simplified Data Processing on Large Clusters

文章目錄 1 概念2 編程模型3 實現3.1 MapReduce執行流程3.2 master數據結構3.3 容錯機制3.3.1 worker故障3.3.2 master故障3.3.3 出現故障時的語義 3.4 存儲位置3.5 任務粒度3.6 備用任務 4 擴展技巧4.1 分區函數4.2 順序保證4.3 Combiner函數4.4 輸入和輸出的類型4.5 副作用4.…

用balenaEtcher燒錄ubuntu的iso文件都失敗,所以選用了另一種燒錄的軟件Rufus,然后燒錄成功了+安裝ubuntu的坑

https://releases.ubuntu.com/bionic/進入網頁下載ubuntu 選擇燒錄軟件將下載的Ubuntu燒錄到U盤中 之前用這個U盤燒錄過一次&#xff0c;成功了&#xff0c;后來應該是U盤受損或者是什么其他原因使得用這個U盤總是燒錄失敗 換思路&#xff1a;由于一直使用balenaEtcher燒錄ubu…

3 ESP32的PWM控制

Esp32的PWM控制也配置庫函數&#xff0c;以下就是PWM所用到的函數 1 PWM通道初始化設置 函數原型uint32_t ledcSetup(uint8_t chan, uint32_t freq, uint8_t bit_num)函數功能設定指定LEDC通道的PWM信號頻率和占空比分辨率返回值通道PWM信號的頻率參數說明chan&#xff08;LE…

WebView基礎知識以及Androidx-WebKit的使用

文章目錄 摘要WebView基礎一、啟動調整模式二、WebChromeClient三、WebViewClient四、WebSettings五、WebView和Native交互 Androidx-WebKit一、啟動安全瀏覽服務二、設置代理三、安全的 WebView 和 Native 通信支持四、文件傳遞五、深色主題的支持六、JavaScript and WebAssem…

ipa 功能包調試,分區算法,覆蓋算法測試

參考 wiki 流網絡 flow network 解釋 相關文章 ipa 分區算法 ipa 分區算法總結&#xff0c;部分算法圖解 環境 ubuntu20&#xff0c;ros 版本 noetic 運行測試 按照 readme 提示進行測試&#xff0c;跳過第一個步驟&#xff0c;并不需要 turtlebot3。 執行第三個 launch 報…

vue element checkbox的實現

實現多選非常簡單: 手動添加一個el-table-column&#xff0c;設type屬性為selection即可&#xff1b;默認情況下若內容過多會折行顯示&#xff0c;若需要單行顯示可以使用show-overflow-tooltip屬性&#xff0c;它接受一個Boolean&#xff0c;為true時多余的內容會在 hover 時以…

Java8 快速實現List轉map 、分組、過濾等操作

Java 8 是 Java 編程語言的一個重要版本&#xff0c;它引入了許多新特性和改進&#xff0c;使得 Java 開發變得更加高效和現代。 下面我們就來使用Java8 快速實現List轉map 、分組、過濾等操作。 定義1個用戶對象 public class User {private Integer id;private String nam…

計算機通信

一.進程和線程的區別? 1. 進程是資源分配的最小單位, 線程是cpu進行調度的最小單位。 2. 一個進程可以看做一個運行的程序, 一個進程中可以包含多個線程, 線程在進程內執行。 3. 多進程是指操作系統能同時運行多個任務&#xff08;程序&#xff09;&#xff0c;多線程是指在同…

數據挖掘原理與應用------分類預測

在數據挖掘和機器學習領域&#xff0c;TPR&#xff08;True Positive Rate&#xff09;是指在實際為陽性的情況下&#xff0c;模型正確預測為陽性的比例。TPR也被稱為靈敏度&#xff08;Sensitivity&#xff09;或召回率&#xff08;Recall&#xff09;。它是評估分類模型性能的…

【Linux】探索 Linux du 命令:管理磁盤空間的利器

給我一個擁抱 給我肩膀靠靠 你真的不需要 對我那么好 思念就像毒藥 讓人受不了的煎熬 我會迷戀上癮賴在你懷抱 &#x1f3b5; 陶鈺玉《深夜地下鐵》 在 Linux 系統管理中&#xff0c;磁盤空間管理是一項基礎而重要的任務。du&#xff08;disk usage&#…

如何解決IntelliJ IDEA中pom.xml依賴項引發的安全漏洞黃線警告問題

背景 在開發過程中&#xff0c;當我們在pom.xml文件中添加依賴項時&#xff0c;經常會發現IntelliJ IDEA報出黃色警告線條&#xff0c;提示存在潛在的安全漏洞。警告的具體展現形式如下&#xff1a; 解決方案 首先&#xff0c;打開設置菜單界面&#xff0c;接著選擇編輯器選…

vue3土味情話pinia可以持久保存再次修改App樣式

我是不是你最疼愛的人-失去愛的城市 <template><div class"talk"><button click"getLoveTalk">土味情話</button><ul><li v-for"talk in talkStore.talkList" :key"talk.id">{{ talk.title }}<…

用 Supabase CLI 進行本地開發環境搭建

文章目錄 &#xff08;零&#xff09;前言&#xff08;一&#xff09;Supabase CLI&#xff08;1.1&#xff09;安裝 Scoop&#xff08;1.2&#xff09;用 Scoop 安裝 Supabase CLI &#xff08;二&#xff09;本地項目環境&#xff08;2.1&#xff09;初始化項目&#xff08;2…

基于gin框架的文件上傳(逐行解析)

基于gin框架的文件上傳(逐行解析)記錄一下使用gin框架完成一個文件上傳的功能&#xff0c;一下是實現該功能的代碼&#xff0c;適合小白&#xff0c;代碼都有逐行解釋&#xff01; app.go: package routerimport ("chat/service""github.com/gin-gonic/gin&qu…