【Hot 100】94. 二叉樹的中序遍歷

目錄

  • 引言
  • 二叉樹的中序遍歷
    • 我的解題
    • 代碼優化
      • 更清晰的表述建議:

請添加圖片描述

  • 🙋?♂? 作者:海碼007
  • 📜 專欄:算法專欄
  • 💥 標題:【Hot 100】94. 二叉樹的中序遍歷
  • ?? 寄語:書到用時方恨少,事非經過不知難!

引言

今天開始二叉樹的篇章,繼續加油。

二叉樹的中序遍歷

  • 🎈 題目鏈接:https://leetcode.cn/problems/binary-tree-inorder-traversal/description/?envType=study-plan-v2&envId=top-100-liked
  • 🎈 做題狀態:

我的解題

二叉樹的遍歷有四種,分別是前序、中序、后序以及層次遍歷。前中后序遍歷可以通過遞歸寫出清晰的代碼,當然也可以通過棧來寫出非遞歸的代碼。然后是層次遍歷通過借助隊列來實現一層一層的遍歷順序。

下面來解析一下我的代碼,本題給出的核心函數是 inorderTraversal 然后函數有一個返回值,這個返回值記錄的是二叉樹的值。如果我直接將 inorderTraversal 作為一個遞歸函數來寫的話,就需要處理這個返回值,要考慮如何將這個返回值合并。所以為了讓記錄變得更加方便我新建了一個遞歸函數 midTraversal ,這個函數沒有返回值,但是使用了引用傳遞來讓這個結果合并起來。

class Solution {
public:void midTraversal(TreeNode* node, vector<int>& data){if (!node) return;midTraversal(node->left, data);data.push_back(node->val);midTraversal(node->right, data);}vector<int> inorderTraversal(TreeNode* root) {vector<int> res;midTraversal(root, res);return res;}
};

代碼優化

  1. 遞歸函數的返回值問題

    • 如果直接讓 inorderTraversal 遞歸調用自身,每次遞歸都需要合并子樹的遍歷結果(即處理返回值),這會增加代碼復雜度。
    • 例如:
      vector<int> inorderTraversal(TreeNode* root) {if (!root) return {};auto left = inorderTraversal(root->left);  // 需要合并左子樹的結果auto right = inorderTraversal(root->right); // 需要合并右子樹的結果left.push_back(root->val);                // 插入當前節點left.insert(left.end(), right.begin(), right.end()); // 合并右子樹return left; // 返回合并后的結果
      }
      
    • 這種寫法需要頻繁合并向量,效率較低(時間復雜度為 O(n^2)),且代碼冗余。
  2. 引用傳遞的優化

    • 通過引入輔助函數 midTraversal,將結果向量 data 通過引用傳遞,避免返回值合并的問題。
    • 遞歸過程中直接修改同一個 data 向量,無需合并,效率更高(時間復雜度 O(n))。

更清晰的表述建議:

“中序遍歷的遞歸實現需要按左子樹->根節點->右子樹的順序訪問節點。如果直接在 inorderTraversal 中遞歸,每次遞歸調用會返回一個獨立的向量,需要將這些向量合并(如拼接左子樹、當前節點、右子樹的結果),效率較低。
因此,我引入輔助函數 midTraversal,通過引用傳遞一個共享的結果向量 data。遞歸過程中,所有節點值直接追加到 data 中,無需合并操作,既簡化了代碼,又保證了線性時間復雜度。”

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

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

相關文章

大語言模型(LLMs)微調技術總結

文章目錄 全面總結當前大語言模型&#xff08;LLM&#xff09;微調技術1. 引言2. 為什么需要微調&#xff1f;3. 微調技術分類概覽4. 各種微調技術詳細介紹4.1 基礎微調方法4.1.1 有監督微調&#xff08;Supervised Fine-Tuning, SFT&#xff09;4.1.2 全參數微調&#xff08;F…

解決Maven項目中報錯“java不支持版本6即更高的版本 7”

錯誤背景 當Maven項目編譯或運行時出現錯誤提示 Java不支持版本6即更高的版本7&#xff0c;通常是由于項目配置的JDK版本與當前環境或編譯器設置不一致導致的。例如&#xff1a; 項目配置的Java版本為6或7&#xff0c;但實際使用的是JDK 17。Maven或IDE的編譯器未正確指定目標…

C++筆記-多態(包含虛函數,純虛函數和虛函數表等)

1.多態的概念 多態(polymorphism)的概念:通俗來說&#xff0c;就是多種形態。多態分為編譯時多態(靜態多態)和運行時多態(動態多態)&#xff0c;這里我們重點講運行時多態&#xff0c;編譯時多態(靜態多態)和運行時多態(動態多態)。編譯時多態(靜態多態)主要就是我們前面講的函…

【Unity】MVP框架的使用例子

在提到MVP之前&#xff0c;可以先看看這篇MVC的帖子&#xff1a; 【Unity】MVC的簡單分享以及一個在UI中使用的例子 MVC的不足之處&#xff1a; 在MVC的使用中&#xff0c;會發現View層直接調用了Model層的引用&#xff0c;即這兩個層之間存在著一定的耦合性&#xff0c;而MV…

前端js學算法-實踐

1、兩數之和 const twoSum (nums, target) > {const obj {}for (let m 0; m < nums.length; m) {const cur nums[m]const diff target - curif(obj.hasOwnProperty(diff)){ // 查詢對象中是否存在目標值-當前值鍵值對console.log([obj[diff], m]) // 存在則直接獲取…

《MATLAB實戰訓練營:從入門到工業級應用》趣味入門篇-用聲音合成玩音樂:MATLAB電子琴制作(超級趣味實踐版)

《MATLAB實戰訓練營&#xff1a;從入門到工業級應用》趣味入門篇-用聲音合成玩音樂&#xff1a;MATLAB電子琴制作&#xff08;超級趣味實踐版&#xff09; 開篇&#xff1a;當MATLAB遇見音樂 - 一場數字與藝術的浪漫邂逅 想象一下&#xff0c;你正坐在一臺古老的鋼琴前&#x…

實戰探討:為什么 Redis Zset 選擇跳表?

在了解了跳表的原理和實現后&#xff0c;一個常見的問題&#xff08;尤其是在面試中&#xff09;隨之而來&#xff1a;為什么像 Redis 的有序集合 (Zset) 這樣的高性能組件會選擇使用跳表&#xff0c;而不是大家熟知的平衡樹&#xff08;如紅黑樹&#xff09;呢&#xff1f; 對…

數據結構-線性結構(鏈表、棧、隊列)實現

公共頭文件common.h #define TRUE 1 #define FALSE 0// 定義節點數據類型 #define DATA_TYPE int單鏈表C語言實現 SingleList.h #pragma once#include "common.h"typedef struct Node {DATA_TYPE data;struct Node *next; } Node;Node *initList();void headInser…

高中數學聯賽模擬試題精選學數學系列第3套幾何題

△ A B C \triangle ABC △ABC 的內切圓 ⊙ I \odot I ⊙I 分別與邊 B C BC BC, C A CA CA, A B AB AB 相切于點 D D D, E E E, F F F, D D ′ DD DD′ 為 ⊙ I \odot I ⊙I 的直徑, 過圓心 I I I 作直線 A D ′ AD AD′ 的垂線 l l l, 直線 l l l 分別與 D E DE…

使用 ossutil 上傳文件到阿里云 OSS

在處理文件存儲和傳輸時&#xff0c;阿里云的對象存儲服務&#xff08;OSS&#xff09;是一個非常方便的選擇。特別是在需要批量上傳文件或通過命令行工具進行文件管理時&#xff0c;ossutil提供了強大的功能。本文將詳細說明如何使用 ossutil 上傳文件到阿里云 OSS&#xff0c…

DeepSeek與MySQL:開啟數據智能新時代

目錄 一、引言&#xff1a;技術融合的力量二、DeepSeek 與 MySQL&#xff1a;技術基石2.1 DeepSeek 技術探秘2.2 MySQL 數據庫深度解析 三、DeepSeek 與 MySQL 集成&#xff1a;從理論到實踐3.1 集成原理剖析3.2 集成步驟詳解 四、應用案例&#xff1a;實戰中的價值體現4.1 電商…

WebAPI項目從Newtonsoft.Json遷移到System.Text.Json踩坑備忘

1.控制器層方法返回類型不能為元組 控制器層方法返回類型為元組時&#xff0c;序列化結果為空。 因為元組沒有屬性只有field&#xff0c;除非使用IncludeFields參數專門指定&#xff0c;否則使用System.Text.Json進行序列化時不會序列化field var options new JsonSerializ…

202553-sql

目錄 一、196. 刪除重復的電子郵箱 - 力扣&#xff08;LeetCode&#xff09; 二、602. 好友申請 II &#xff1a;誰有最多的好友 - 力扣&#xff08;LeetCode&#xff09; 三、176. 第二高的薪水 - 力扣&#xff08;LeetCode&#xff09; 一、196. 刪除重復的電子郵箱 - 力扣…

Spring Boot的GraalVM支持:構建低資源消耗微服務

文章目錄 引言一、GraalVM原生鏡像技術概述二、Spring Boot 3.x的GraalVM支持三、適配GraalVM的關鍵技術點四、構建原生鏡像微服務實例五、性能優化與最佳實踐總結 引言 微服務架構已成為企業應用開發的主流模式&#xff0c;但隨著微服務數量的增加&#xff0c;資源消耗問題日…

pip 常用命令及配置

一、python -m pip install 和 pip install 的區別 在講解 pip 的命令之前&#xff0c;我們有必要了解一下 python -m pip install 和 pip install 的區別&#xff0c;以便于我們在不同的場景使用不同的方式。 python -m pip install 命令使用 python 可執行文件將 pip 模塊作…

Vue高級特性實戰:自定義指令、插槽與路由全解析

一、自定義指令 1.如何自定義指令 ⑴.全局注冊語法 通過 Vue.directive 方法注冊&#xff0c;語法格式為&#xff1a; Vue.directive(指令名, {// 鉤子函數&#xff0c;元素插入父節點時觸發&#xff08;僅保證父節點存在&#xff0c;不一定已插入文檔&#xff09;inserted(…

本地大模型編程實戰(32)用websocket顯示大模型的流式輸出

在與 LLM(大語言模型) 對話時&#xff0c;如果每次都等 LLM 處理完畢再返回給客戶端&#xff0c;會顯得比較卡頓&#xff0c;不友好。如何能夠像主流的AI平臺那樣&#xff1a;可以一點一點吐出字符呢&#xff1f; 本文將模仿后端流式輸出文字&#xff0c;前端一塊一塊的顯示文字…

人工智能-深度學習之卷積神經網絡

深度學習 mlp弊端卷積神經網絡圖像卷積運算卷積神經網絡的核心池化層實現維度縮減卷積神經網絡卷積神經網絡兩大特點卷積運算導致的兩個問題&#xff1a;圖像填充&#xff08;padding&#xff09;結構組合問題經典CNN模型LeNet-5模型AlexNet模型VGG-16模型 經典的CNN模型用于新…

藍橋杯電子賽_繼電器和蜂鳴器

目錄 一 前言 二 繼電器和蜂鳴器實物 三 分析部分 &#xff08;1&#xff09;bsp_init.c &#xff08;2&#xff09;蜂鳴器和繼電器原理圖 &#xff08;3&#xff09;ULN2003 &#xff08;4&#xff09;他們倆所連接的鎖存器 四 代碼 在這里要特別說一點&#xff01;&…

仿騰訊會議——主界面設計創建房間加入房間客戶端實現

1、實現騰訊會議主界面 2、添加Qt類WeChatDialog 3、定義創建會議和加入會議的函數 4、實現顯示名字、頭像的函數 調用函數 5、在中間者類中綁定函數 6、實現創建房間的槽函數 7、實現加入房間的槽函數 8、設置界面標題 9、服務器定義創建和進入房間函數 10、服務器實現創建房間…