[面試精選] 0094. 二叉樹的中序遍歷

文章目錄

      • 1. 題目鏈接
      • 2. 題目描述
      • 3. 題目示例
      • 4. 解題思路
      • 5. 題解代碼
      • 6. 復雜度分析

1. 題目鏈接


94. 二叉樹的中序遍歷 - 力扣(LeetCode)

2. 題目描述


給定一個二叉樹的根節點 root ,返回 它的 中序 遍歷 。


3. 題目示例


示例 1 :

輸入:root = [1,null,2,3]
輸出:[1,3,2]

示例 2 :

輸入:root = []
輸出:[]

4. 解題思路


  1. 顏色標記法
    • 使用顏色標記節點狀態:1(未訪問)、2(已訪問)
    • 模擬遞歸棧的調用過程,但通過顯式棧實現
  2. 棧操作順序
    • 對于未訪問節點(color=1),按"右-根-左"順序入棧
    • 這樣出棧順序就是"左-根-右",符合中序遍歷要求
  3. 關鍵點
    • 通過顏色標記避免重復處理
    • 顯式棧替代遞歸調用棧
    • 空節點直接跳過

5. 題解代碼


class Solution {// 輔助節點類,用于標記節點狀態class Node {TreeNode node;  // 樹節點int color;      // 顏色標記:1表示未訪問,2表示已訪問Node(TreeNode node, int color) {this.node = node;this.color = color;}}// 中序遍歷方法public List<Integer> inorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();  // 存儲遍歷結果Deque<Node> stack = new LinkedList<>();  // 使用雙端隊列模擬棧// 空樹直接返回if (root == null) return ans;// 初始狀態:根節點標記為未訪問stack.push(new Node(root, 1));while (!stack.isEmpty()) {Node cur = stack.pop();  // 彈出棧頂元素// 跳過空節點if (cur.node == null) continue;if (cur.color == 1) {  // 未訪問節點// 按照"右-根-左"順序入棧(出棧順序為"左-根-右")stack.push(new Node(cur.node.right, 1));  // 右子節點(未訪問)stack.push(new Node(cur.node, 2));        // 當前節點標記為已訪問stack.push(new Node(cur.node.left, 1));   // 左子節點(未訪問)} else {  // 已訪問節點ans.add(cur.node.val);  // 添加到結果列表}}return ans;}
}

6. 復雜度分析


  1. 時間復雜度:O(n)
    • 每個節點被訪問兩次(入棧和出棧)
    • 但常數系數為2,仍為線性復雜度
  2. 空間復雜度:O(n)
    • 棧的最大深度等于樹的高度
    • 最壞情況下(斜樹)為O(n)

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

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

相關文章

Addressable-配置相關

1、Profile 概述窗口配置 主要用于配置Addressable打包&#xff08;構建&#xff09;加載AB包時使用的一些變量,這些變量定義了 在哪里保存打包&#xff08;構建&#xff09;的AB包運行時在哪里加載AB包 可以添加自定義變量&#xff0c;以便在打包加載時使用,之后在設置 組中…

aws(學習筆記第四十三課) s3_sns_sqs_lambda_chain

文章目錄 aws(學習筆記第四十三課) s3_sns_sqs_lambda_chain學習內容&#xff1a;1. 整體架構1.1 代碼鏈接1.2 整體架構1.3 測試代碼需要的修改1.3.1 unit test代碼中引入stack的修改1.3.2 test_outputs_created代碼中把錯誤的去掉 2. 代碼解析2.1 生成dead_letter_queue死信隊…

Python訓練營打卡Day43

kaggle找到一個圖像數據集&#xff0c;用cnn網絡進行訓練并且用grad-cam做可視化 進階&#xff1a;并拆分成多個文件 config.py import os# 基礎配置類 class Config:def __init__(self):# Kaggle配置self.kaggle_username "" # Kaggle用戶名self.kaggle_key &quo…

hive 3集成Iceberg 1.7中的Java版本問題

hive 3.1.3 集成iceberg 1.7.2創建Iceberg表報錯如下&#xff1a; Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/iceberg/mr/hive/HiveIcebergStorageHandler has been compiled by a more recent version of the Java Runtime …

文本切塊技術(Splitter)

為什么要分塊&#xff1f; 將長文本分解成適當大小的片段&#xff0c;以便于嵌入、索引和存儲&#xff0c;并提高檢索的精確度。 用ChunkViz工具可視化分塊 在線使用 ChunkViz github https://github.com/gkamradt/ChunkViz 如何確定大模型所能接受的最長上下文 可以從…

C++:用 libcurl 發送一封帶有附件的郵件

編寫mingw C 程序&#xff0c;用 libcurl 發送一封帶有附件的郵件 下面是一個使用 MinGW 編譯的 C 程序&#xff0c;使用 libcurl 發送帶附件的郵件。這個程序完全通過代碼實現 SMTP 郵件發送&#xff0c;不依賴外部郵件客戶端&#xff1a; // send_email.cpp #include <i…

tensorflow image_dataset_from_directory 訓練數據集構建

以數據集 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 為例 目錄結構 訓練圖像數據集要求&#xff1a; 主目錄下包含多個子目錄&#xff0c;每個子目錄代表一個類別。每個子目錄中存儲屬于該類別的圖像文件。 例如 main_directory/ ...cat/ ...…

遨游Spring AI:第一盤菜Hello World

Spring AI的正式版已經發布了&#xff0c;很顯然&#xff0c;接下來我們要做的事情就是寫一個Hello World。 總體思路就是在本地搭建一個簡單的大模型&#xff0c;然后編寫Spring AI代碼與模型進行交互。 分五步&#xff1a; 1. 安裝Ollama&#xff1b; 2. 安裝DeepSeek&…

華為云Flexus+DeepSeek征文|基于華為云Flexus X和DeepSeek-R1打造個人知識庫問答系統

目錄 前言 1 快速部署&#xff1a;一鍵搭建Dify平臺 1.1 部署流程詳解 1.2 初始配置與登錄 2 構建專屬知識庫 2.1 進入知識庫模塊并創建新庫 2.2 選擇數據源導入內容 2.3 上傳并識別多種文檔格式 2.4 文本處理與索引構建 2.5 保存并完成知識庫創建 3接入ModelArts S…

Java優化:雙重for循環

在工作中&#xff0c;經常性的會出現在兩張表中查找相同ID的數據&#xff0c;許多開發者會使用兩層for循環嵌套&#xff0c;雖然實現功能沒有問題&#xff0c;但是效率極低&#xff0c;一下是一個簡單的優化過程&#xff0c;代碼耗時湊從26856ms優化到了748ms。 功能場景 有兩…

Prompt Tuning:生成的模型文件有什么構成

一、為什么Prompt Tuning會生成模型文件? 1. Prompt Tuning的本質:優化可訓練的「提示參數」 核心邏輯:Prompt Tuning(提示調優)是一種輕量級的微調技術,僅優化模型輸入層的提示向量(Prompt Embedding)或少量額外參數,而非更新整個預訓練模型的權重。生成模型文件的原…

ARM SMMUv3簡介(一)

1.概述 SMMU&#xff08;System Memory Management Unit&#xff0c;系統內存管理單元&#xff09;是ARM架構中用于管理設備訪問系統內存的硬件模塊。SMMU和MMU的功能類似&#xff0c;都是將虛擬地址轉換成物理地址&#xff0c;不同的是MMU轉換的虛擬地址來自CPU&#xff0c;S…

在 Windows 系統上運行 Docker 容器中的 Ubuntu 鏡像并顯示 GUI

在 Windows 上安裝一個 X Server&#xff08;如 VcXsrv 或 X410&#xff09;&#xff0c;Ubuntu 容器通過網絡將圖形界面轉發到 Windows。 步驟&#xff1a; 安裝 X Server&#xff1a; 推薦使用VcXsrv&#xff0c;免費開源。 安裝后運行 XLaunch&#xff0c;選擇&#xff1…

Vue3學習(4)- computed的使用

1. 簡述與使用 作用&#xff1a;computed 用于基于響應式數據派生出新值&#xff0c;其值會自動緩存并在依賴變化時更新。 ?緩存機制?&#xff1a;依賴未變化時直接返回緩存值&#xff0c;避免重復計算&#xff08;通過 _dirty 標志位實現&#xff09;。?響應式更新?&…

【HarmonyOS 5】出行導航開發實踐介紹以及詳細案例

以下是 ?HarmonyOS 5? 出行導航的核心能力詳解&#xff08;無代碼版&#xff09;&#xff0c;聚焦智能交互、多端協同與場景化創新&#xff1a; 一、交互革新&#xff1a;從被動響應到主動服務 ?意圖驅動導航? ?自然語義理解?&#xff1a;用戶通過語音指令&#xff08;如…

csrf攻擊學習

原理 csrf又稱跨站偽造請求攻擊&#xff0c;現代網站利用Cookie、Session 或 Token 等機制識別用戶身份&#xff0c;一旦用戶訪問某個網站&#xff0c;瀏覽器在之后請求會自動帶上這些信息來識別用戶身份。用戶在網站進行請求或者操作時服務器會給出對應的內容&#xff0c;比如…

深入剖析MySQL鎖機制,多事務并發場景鎖競爭

一、隱藏字段對 InnoDB 的行鎖&#xff08;Record Lock&#xff09;與間隙鎖&#xff08;Gap Lock&#xff09;的影響 1. 隱藏字段與鎖的三大核心影響 類型影響維度描述DB_TRX_IDMVCC 可見性控制決定是否讀取當前版本&#xff0c;或在加鎖時避開不可見版本&#xff08;影響加鎖…

以SMMUv2為例,使用Trace32可視化操作SMMU的常用命令詳解

Trace32支持一系列的SMMU命令&#xff0c;可以幫助用戶更好地配置、查看和分析SMMU。換句話說&#xff0c;就是讓SMMU的配置變得可視化。 在添加SMMU實例之前&#xff0c;需要選擇一個CPU來激活該SMMU實例的相關命令。Trace32讓SMMU的配置可視化的本質是&#xff0c;操縱CPU讀取…

將數據庫表導出為C#實體對象

數據庫方式 use 數據庫;declare TableName sysname 表名 declare Result varchar(max) /// <summary> /// TableName /// </summary> public class TableName {select Result Result /// <summary>/// CONVERT(NVARCHAR(500), ISNULL(ColN…

CSS 預處理器與工具

目錄 CSS 預處理器與工具1. Less主要特性 2. Sass/SCSS主要特性 3. Tailwind CSS主要特性 4. 其他工具PostCSSCSS Modules 5. 選擇建議 CSS 預處理器與工具 1. Less Less 是一個 CSS 預處理器&#xff0c;它擴展了 CSS 語言&#xff0c;添加了變量、嵌套規則、混合&#xff0…