熱門面試題第15天|最大二叉樹 合并二叉樹 驗證二叉搜索樹 二叉搜索樹中的搜索

654.最大二叉樹

力扣題目地址(opens new window)

給定一個不含重復元素的整數數組。一個以此數組構建的最大二叉樹定義如下:

  • 二叉樹的根是數組中的最大元素。
  • 左子樹是通過數組中最大值左邊部分構造出的最大二叉樹。
  • 右子樹是通過數組中最大值右邊部分構造出的最大二叉樹。

通過給定的數組構建最大二叉樹,并且輸出這個樹的根節點。

示例 :

654.最大二叉樹

提示:

給定的數組的大小在 [1, 1000] 之間。

?思路:

其實這個最大二叉樹的定義和二叉搜索樹非常像,我們能想到的是先找到里面最大的節點,將其放在根節點,然后去它的左子樹里面尋找,接著去右子樹里面尋找,屬于前序遍歷。

確定遞歸函數參數以及返回值

public TreeNode constructMaximumBinaryTree1(int[] nums, int leftIndex, int rightIndex)

我們根據傳入的數組,和數組的起始結束節點來確定邊界

確定終止條件

if (rightIndex - leftIndex < 1) {// 沒有元素了return null;}if (rightIndex - leftIndex == 1) {// 只有一個元素return new TreeNode(nums[leftIndex]);}

當沒有元素的時候直接退出,只有一個元素的時候直接return即可

確定單層遞歸的邏輯

        int maxIndex = leftIndex;// 最大值所在位置int maxVal = nums[maxIndex];// 最大值for (int i = leftIndex + 1; i < rightIndex; i++) {if (nums[i] > maxVal){maxVal = nums[i];maxIndex = i;}}TreeNode root = new TreeNode(maxVal);// 根據maxIndex劃分左右子樹root.left = constructMaximumBinaryTree1(nums, leftIndex, maxIndex);root.right = constructMaximumBinaryTree1(nums, maxIndex + 1, rightIndex);return root;

通過循環找到最大值,再通過遞歸左,右,最后return root即可

我們來看完整代碼、

class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return constructMaximumBinaryTree1(nums, 0, nums.length);}public TreeNode constructMaximumBinaryTree1(int[] nums, int leftIndex, int rightIndex) {if (rightIndex - leftIndex < 1) {// 沒有元素了return null;}if (rightIndex - leftIndex == 1) {// 只有一個元素return new TreeNode(nums[leftIndex]);}int maxIndex = leftIndex;// 最大值所在位置int maxVal = nums[maxIndex];// 最大值for (int i = leftIndex + 1; i < rightIndex; i++) {if (nums[i] > maxVal){maxVal = nums[i];maxIndex = i;}}TreeNode root = new TreeNode(maxVal);// 根據maxIndex劃分左右子樹root.left = constructMaximumBinaryTree1(nums, leftIndex, maxIndex);root.right = constructMaximumBinaryTree1(nums, maxIndex + 1, rightIndex);return root;}
}

617.合并二叉樹

力扣題目鏈接(opens new window)

給定兩個二叉樹,想象當你將它們中的一個覆蓋到另一個上時,兩個二叉樹的一些節點便會重疊。

你需要將他們合并為一個新的二叉樹。合并的規則是如果兩個節點重疊,那么將他們的值相加作為節點合并后的新值,否則不為?NULL 的節點將直接作為新二叉樹的節點。

示例?1:

617.合并二叉樹

注意: 合并必須從兩個樹的根節點開始。

思路:

這道題不難,我們只需要分別對兩個數對應同一位置的節點進行比較,并且對節點進行處理就可以,采用那種遍歷方式都行

確定遞歸方法及其參數

public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {

我們只需要兩棵樹的節點就行

確定終止條件

if (root1 == null) return root2;
if (root2 == null) return root1;

如果樹枝的一部分為空,直接返回另一部分就行了

確定單層遞歸邏輯

        root1.val += root2.val;root1.left = mergeTrees(root1.left,root2.left);root1.right = mergeTrees(root1.right,root2.right);return root1;

將兩個節點的值相加,然后遞歸左右節點即可

我們來看完整代碼

class Solution {// 遞歸public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {if (root1 == null) return root2;if (root2 == null) return root1;root1.val += root2.val;root1.left = mergeTrees(root1.left,root2.left);root1.right = mergeTrees(root1.right,root2.right);return root1;}
}

700.二叉搜索樹中的搜索

力扣題目地址(opens new window)

給定二叉搜索樹(BST)的根節點和一個值。 你需要在BST中找到節點值等于給定值的節點。 返回以該節點為根的子樹。 如果節點不存在,則返回 NULL。

例如,

700.二叉搜索樹中的搜索

在上述示例中,如果要找的值是 5,但因為沒有節點值為 5,我們應該返回 NULL。

思路:

我們找到了對應target值的節點之后進行返回操作即可,中間利用二叉搜索樹的性質進行查找

確定遞歸函數及其參數

public TreeNode searchBST(TreeNode root, int val

傳入節點和target值即可

確定終止條件

if (root == null || root.val == val) {return root;}

當根節點為空或者我們找到了對應值的節點的時候,我們直接返回就行

確定單層遞歸邏輯

if (val < root.val) {return searchBST(root.left, val);} else {return searchBST(root.right, val);}

如果root的值比target大,我們就從root的左子樹去遞歸,反之亦然

我們來看完整代碼

class Solution {// 遞歸,利用二叉搜索樹特點,優化public TreeNode searchBST(TreeNode root, int val) {if (root == null || root.val == val) {return root;}if (val < root.val) {return searchBST(root.left, val);} else {return searchBST(root.right, val);}}
}

98.驗證二叉搜索樹

力扣題目鏈接(opens new window)

給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。

假設一個二叉搜索樹具有如下特征:

  • 節點的左子樹只包含小于當前節點的數。
  • 節點的右子樹只包含大于當前節點的數。
  • 所有左子樹和右子樹自身必須也是二叉搜索樹。

98.驗證二叉搜索樹

?思路 :二叉搜索樹 左節點小于中間節點小于右節點,注意是所有左節點 下面這個情況是不符合的

不能單純的比較左節點小于中間節點,右節點大于中間節點就完事了

寫出了類似這樣的代碼:

if (root->val > root->left->val && root->val < root->right->val) {return true;
} else {return false;
}

?確定終止條件

if (root == NULL) return true;

遞歸到空節點,我們返回true,因為空節點也是二叉搜索樹

確定單層遞歸邏輯

 boolean left = isValidBST(root.left);if (pre != null && pre.val >= root.val) return false;pre = root; // 記錄前一個節點boolean right = isValidBST(root.right);return left && right;

左中右,中序遍歷找到最左邊,最小的節點值,然后一層一層返回去判斷當前節點值是否大于pre,一旦有一個節點不滿足,就會返回false 然后向上返回回去。

我們可以通過圖示理解

    5/ \3   7/ \   \
1   4   8
isValidBST(5)
├── left = isValidBST(3)
│   ├── left = isValidBST(1)
│   │   ├── left = isValidBST(NULL) → true
│   │   ├── pre = NULL → 1
│   │   └── right = isValidBST(NULL) → true
│   │   └── 返回:true && true = true
│   ├── pre = 1 → 3
│   └── right = isValidBST(4)
│       ├── left = isValidBST(NULL) → true
│       ├── pre = 3 → 4
│       └── right = isValidBST(NULL) → true
│       └── 返回:true && true = true
│   └── 返回:true && true = true
├── pre = 4 → 5
└── right = isValidBST(7)├── left = isValidBST(NULL) → true├── pre = 5 → 7└── right = isValidBST(8)├── left = isValidBST(NULL) → true├── pre = 7 → 8└── right = isValidBST(NULL) → true└── 返回:true && true = true└── 返回:true && true = true
└── 返回:true && true = true

我們來看完整代碼

class Solution {private TreeNode pre = null; // 用來記錄前一個節點public boolean isValidBST(TreeNode root) {if (root == null) return true;boolean left = isValidBST(root.left);if (pre != null && pre.val >= root.val) return false;pre = root; // 記錄前一個節點boolean right = isValidBST(root.right);return left && right;}
}

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

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

相關文章

MySQL學習筆記7【InnoDB】

Innodb 1. 架構 1.1 內存部分 buffer pool 緩沖池是主存中的第一個區域&#xff0c;里面可以緩存磁盤上經常操作的真實數據&#xff0c;在執行增刪查改操作時&#xff0c;先操作緩沖池中的數據&#xff0c;然后以一定頻率刷新到磁盤&#xff0c;這樣操作明顯提升了速度。 …

RNN、LSTM、GRU匯總

RNN、LSTM、GRU匯總 0、論文匯總1.RNN論文2、LSTM論文3、GRU4、其他匯總 1、發展史2、配置和架構1.配置2.架構 3、基本結構1.神經元2.RNN1. **RNN和前饋網絡區別&#xff1a;**2. 計算公式&#xff1a;3. **梯度消失:**4. **RNN類型**:&#xff08;查看發展史&#xff09;5. **…

django數據遷移操作受阻

錯誤信息&#xff1a; django.db.utils.OperationalError: (1227, Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation)根據錯誤信息分析&#xff0c;該問題是由于MySQL用戶 缺乏SYSTEM_VARI…

WinForm真入門(13)——ListBox控件詳解

WinForm ListBox 詳解與案例 一、核心概念 ?ListBox? 是 Windows 窗體中用于展示可滾動列表項的控件&#xff0c;支持單選或多選操作&#xff0c;適用于需要用戶從固定數據集中選擇一項或多項的場景?。 二、核心屬性 屬性說明?Items?管理列表項的集合&#xff0c;支持動…

局域網內文件共享的實用軟件推薦

軟件介紹 在日常辦公、學習或家庭網絡環境里&#xff0c;局域網內文件共享是個常見需求。有一款免費的局域網共享軟件非常適合這種場景。 這款局域網共享軟件使用起來非常簡單&#xff0c;不需要安裝&#xff0c;直接點擊就能使用。 它的操作流程簡單易懂&#xff0c;用戶只要…

ViewModel vs AndroidViewModel:核心區別與使用場景詳解

在 Android 的 MVVM 架構中&#xff0c;ViewModel 和 AndroidViewModel 都是用于管理 UI 相關數據的組件&#xff0c;但二者有一些關鍵區別&#xff1a; 1. ViewModel 基本用途&#xff1a;用于存儲和管理與 UI 相關的數據&#xff0c;生命周期與 Activity/Fragment 解耦&…

C語言--求n以內的素數(質數)

求n以內的素數&#xff0c;可以用試除法或者埃拉托斯特尼篩法&#xff08;埃氏篩法&#xff09; 文章目錄 試除法埃拉托斯特尼篩法&#xff08;埃氏篩法&#xff09;兩種方法測試運行效率 輸入&#xff1a;數字n 輸出&#xff1a;n以內所有的素數 不管是哪個方法&#xff0c;都…

Skynet.socket 函數族使用詳解

目錄 Skynet.socket 函數族使用詳解核心功能分類一、TCP 連接管理1. 監聽端口2. 建立連接3. 關閉連接 二、數據讀寫操作1. 阻塞式讀取2. 寫入數據2.1 socket.write(fd, data) 的返回值2.2 示例代碼2.3 關鍵注意事項2.4 與其他函數的區別2.5 底層原理2.6 總結 三、UDP 處理1. 創…

Unity Addressables資源生命周期自動化監控技術詳解

一、Addressables資源生命周期管理痛點 1. 常見資源泄漏場景 泄漏類型典型表現檢測難度隱式引用泄漏腳本持有AssetReference未釋放高異步操作未處理AsyncOperationHandle未釋放中循環依賴泄漏資源相互引用無法釋放極高事件訂閱泄漏未取消事件監聽導致對象保留高 2. 傳統管理…

aws(學習筆記第三十八課) codepipeline-build-deploy-github-manual

文章目錄 aws(學習筆記第三十八課) codepipeline-build-deploy-github-manual學習內容:1. 整體架構1.1 代碼鏈接1.2 全體處理架構2. 代碼分析2.1 創建`ImageRepo`,并設定給`FargateTaskDef`2.2 創建`CodeBuild project`2.3 對`CodeBuild project`賦予權限(`ECR`的`image rep…

在windows服務器使用Nginx反向代理云端的python實現的web應用

近日得閑&#xff0c;計劃將之前寫過的一些小桌面程序搬到云服務器上方便隨時隨地使用&#xff0c;同時也學習一些基本的網站開發和搭建知識&#xff0c;于是在AI的幫助下&#xff0c;基于niceguifastapi非常快捷地搞出來了一個前后端一體的網站程序&#xff0c;放在云服務器上…

全球貿易戰火重燃:50%關稅如何絞殺跨境電商低價模式?

一、政策高壓&#xff1a;美國對華貿易戰升級路線圖 2024年5月&#xff0c;美國國會《數字貿易壁壘法案》草案曝光&#xff0c;標志著中美貿易博弈進入新階段&#xff1a; ? 關稅武器精準打擊&#xff1a;成衣、消費電子、小家電稅率擬從10-25%躍升至50% ? 監管范圍擴大&…

0411 | 軟考高項筆記:項目立項

在軟考的項目管理知識體系中&#xff0c;技術可行性和經濟可行性是項目立項階段非常重要的兩個分析維度。以下是對這兩個考點的詳細解釋和記憶方法&#xff1a; 技術可行性分析 定義&#xff1a; 技術可行性分析是評估項目在現有技術條件和資源下是否能夠成功實施。它主要回答…

二分查找3:69. x 的平方根

鏈接&#xff1a;69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 題解&#xff1a; 本題本質是二分查找右端點 x的算數平方根一定在1 ~ x 區間內&#xff0c;在1 ~ x區間內查找一個數num&#xff0c;num^2x&#xff0c;但實際上num不一定是整數&#xff0c;所以是n…

oracle大師認證證書有用嗎

專業能力的高度認可&#xff1a;OCM 是 Oracle認證的最高級別&#xff0c;是對數據庫從業人員技術、知識和操作技能的最高級認可&#xff0c;也是 IT 界頂級認證之一。它表明持證者具備處理關鍵業務數據庫系統和應用的能力&#xff0c;能夠解決最困難的技術難題和最復雜的系統故…

InnoDB 如何解決幻讀:深入解析與 Java 實踐

在數據庫事務管理中&#xff0c;幻讀&#xff08;Phantom Read&#xff09;是并發操作中常見的問題&#xff0c;可能導致數據一致性異常。MySQL 的 InnoDB 存儲引擎通過其事務隔離機制和多版本并發控制&#xff08;MVCC&#xff09;&#xff0c;有效解決了幻讀問題。作為 Java …

【AI編程技術爆發:從輔助工具到生產力革命】

目錄 前言&#xff1a;技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解關鍵技術模塊技術選型對比 二、實戰演示環境配置要求核心代碼實現運行結果驗證 三、性能對比測試方法論量化數據對比&#xff08;2023年數據&#xff09;結果分析 四、最…

ICRA-2025 | 視覺預測助力機器人自主導航!NavigateDiff:視覺引導的零樣本導航助理

論文&#xff1a;Yiran Qin 1 , 2 ^{1,2} 1,2, Ao Sun 2 ^{2} 2, Yuze Hong 2 ^{2} 2, Benyou Wang 2 ^{2} 2, Ruimao Zhang 1 ^{1} 1單位&#xff1a; 1 ^{1} 1中山大學&#xff0c; 2 ^{2} 2香港中文大學深圳校區論文標題&#xff1a;NavigateDiff: Visual Predictors are Ze…

【ESP32S3】GATT Server service table傳送數據到調試助手

前言 在初步學習esp32藍牙的過程中&#xff0c;借鑒了官方的GATT Server Service Table Example&#xff0c;可以在readme中看到&#xff0c;此demo是采用低功耗藍牙的通用屬性服務器來創建訂閱服務和特性。如果你接觸過MQTT&#xff0c;你會發現GATT Server這一特性和MQTT的訂…

DeepSeek :中國 AI 如何用 “小米加步槍” 逆襲硅谷

2025 年春節前夕&#xff0c;人工智能領域誕生了一項重大成果 ——DeepSeek 發布DeepSeek - R1 大模型。這一模型迅速引發廣泛關注&#xff0c;在蘋果 AppStore 中國區免費榜登頂。 DeepSeek 采用開源策略&#xff0c;依據寬松的 MIT 許可證&#xff0c;公開了模型權重、訓練方…