數據結構 二叉樹(3)---層序遍歷二叉樹

在上篇文章中我們主要講了關于實現二叉樹的內容,包括遍歷二叉樹,以及統計二叉樹等內容。而

在這篇文章中我們將詳細講解一下利用隊列的知識實現層序遍歷二叉樹。

那么層序遍歷是什么?以及利用隊列遍歷二叉樹又是怎么遍歷的?下面讓我們一起帶著這些問題深

入研究:

1. 什么是層序遍歷?

我們仍然以之前使用過的二叉樹為例。

對于二叉樹而言 : 層序遍歷二叉樹,簡單說就是按“層次”訪問節點:從根節點開始,先訪問第1層

(根),再訪問第2層(根的左右孩子),接著第3層……逐層從左到右訪問每個節點,直到所有節

點都被訪問。所以對于這棵二叉樹而言,我們可以簡單的推論出這棵二叉樹的層序遍歷就是 :?A? B

C? D? NULL? E? F? NULL? NULL? NULL? NULL? NULL? NULL

2. 為什么要使用隊列實現層序遍歷二叉樹?

用隊列實現這棵二叉樹的層序遍歷,核心就是利用了隊列“先進先出”的特性,剛好匹配層序遍歷

“一層一層、從左到右”的需求。

3.怎樣使用隊列實現層序遍歷二叉樹呢?


利用隊列實現二叉樹層序遍歷,核心是用隊列存儲節點和借助隊列 “先進先出” 的特性,讓二叉樹

節點按 “一層一層、從左到右” 的順序被訪問,具體邏輯可拆解為 3 步:

1. 核心原理:隊列如何適配層序需求

二叉樹層序遍歷要 “按層訪問”,但二叉樹節點靠指針(?left?/?right?)關聯,本身無 “層” 的顯式順

序。隊列的 “先進先出” 特性,能把二叉樹的 “層次順序” 轉化為隊列的 “線性順序”:

- 處理當前層節點時,把下一層節點(左右子節點)按順序入隊 → 保證下一層節點會 “排隊等

待”,按入隊順序被處理(契合層序 “從左到右、一層一層” 的規則)。

2. 隊列的 “先進先出” 完美匹配層序遍歷需求:

- “先進”:處理當前層節點時,優先把下一層的左子節點入隊(保證層序 “從左到右”)。

- “先出”:隊列頭部始終是 “當前層最早入隊的節點”,處理完彈出 → 保證層序 “一層一層” 推進。

對比其他結構(如棧):若用棧(后進先出),節點處理順序會混亂,無法實現 “按層訪問”。因

此,隊列是層序遍歷的 “最佳搭檔”,用其特性彌補了二叉樹層次順序的隱式問題。

簡單說,隊列是層序遍歷的 “工具”:用它的 “排隊邏輯”,把二叉樹的層次關系轉化為可順序處理的

線性結構,讓層序遍歷從抽象需求落地成代碼邏輯?。

4. 代碼的實現

層序遍歷函數(?levelOrder?):

void levelOrder(BTNode* root)
{Queue q;QueueInit(&q);QueuePush(&q, root);while (!QueueEmpty(&q)){//取隊頭,出對頭BTNode* top = QueueFront(&q);QueuePop(&q);printf("%c ", top->data);//將對頭非空左右孩子入隊列if (top->left){QueuePush(&q, top->left);}if (top->right){QueuePush(&q, top->right);}}QueueDestroy(&q);  
}

以下從層序遍歷邏輯和隊列與二叉樹的關系兩方面詳細講解:

層序遍歷核心是按“一層一層”的順序訪問二叉樹節點,借助隊列實現,步驟如下:

1.?初始化隊列

Queue q;
QueueInit(&q);
QueuePush(&q, root);?

- 先創建隊列 ?q??并初始化,再把二叉樹根節點?root?入隊。此時隊列里只有根節點,是層序遍歷的

起點。

2.?循環處理隊列(核心邏輯)

while (!QueueEmpty(&q))?
{BTNode* top = QueueFront(&q); // 取隊頭(當前層節點)QueuePop(&q); ? ? ? ? ? ? ? ? // 彈出隊頭(處理完當前節點,出隊)printf("%c ", top->data); ? ? // 訪問節點數據(打印,也可做其他操作)// 非空左右孩子入隊(為下一層遍歷做準備)if (top->left) ?QueuePush(&q, top->left); ?if (top->right) QueuePush(&q, top->right);?
}

- 循環條件:隊列非空時,持續處理節點(隊列空說明所有層遍歷完畢)。

- 取節點 & 出隊:?QueueFront??拿到當前層的節點(隊頭),?QueuePop??把它移出隊列(因為要

處理該節點的邏輯了)。

- 訪問節點:通過 ?top->data??訪問當前節點數據(比如打印)。

- 子節點入隊:若當前節點的左、右孩子非空,依次入隊——這是層序遍歷的關鍵!保證下一層節

點按順序排隊,后續循環會按“先入先出”處理,自然實現“一層一層”遍歷。

3. 隊列與二叉樹的關系

層序遍歷中,隊列是“橋梁”,用“先入先出”特性適配二叉樹“一層一層訪問”的需求,具體關系體現

在:

1.?隊列的作用:“暫存 + 順序控制”

- 暫存節點:遍歷某一層時,把當前層節點的非空左右孩子入隊,這些孩子屬于“下一層節點”。

- 順序控制:隊列保證節點“先進先出”,契合層序遍歷“從左到右、一層一層”的順序。比如根節點先

入隊,處理根節點時,左、右孩子入隊;后續先處理左孩子(隊頭),再處理右孩子(隊列里排隊

的),完美匹配層序遍歷邏輯。

2.?二叉樹結構對隊列的依賴

二叉樹節點是“分散”的(通過指針關聯左右孩子),無法直接按“層”遍歷。隊列通過“入隊(記錄

下一層節點)→ 出隊(處理當前層節點)”的流程,把二叉樹“分層”的邏輯,轉化為隊列的“線性順

序”操作,讓層序遍歷可實現。

4. 總結:

層序遍歷函數用隊列實現“分層訪問”,隊列的“先入先出”特性,完美匹配二叉樹“一層一層遍歷”的需

求:

- 隊列暫存“下一層節點”,保證遍歷順序;

- 二叉樹的“分層邏輯”,通過隊列轉化為簡單的“入隊 → 出隊 → 處理”流程

4. 函數中用到的隊列相關函數及其作用

假設隊列的底層實現為“鏈式隊列”,以下是各函數的功能說明:

1.??QueueInit(&q)?

- 作用:初始化隊列 ?q?,通常包括設置隊頭/隊尾指針為 ?NULL?、初始化節點數量等,確保隊列可

正常使用。

2.??QueuePush(&q, root)?

- 作用:將節點 ?root??插入隊列尾部(入隊操作),保持“先進先出”的順序。

- 層序遍歷中,用于將當前節點的左右子節點加入隊列,作為下一層的待處理節點。

3.??QueueEmpty(&q)?

- 作用:判斷隊列是否為空(返回 ?true??或 ?false?)。

- 作為循環終止條件:當隊列為空時,說明所有節點已遍歷完畢。

4.??QueueFront(&q)?

- 作用:獲取隊列的隊頭節點(不刪除節點),返回節點指針。

- 層序遍歷中,用于獲取當前層的待訪問節點。

5.??QueuePop(&q)?

- 作用:刪除隊列的隊頭節點(出隊操作)。

- 層序遍歷中,處理完隊頭節點后將其移除,避免重復訪問。

6.??QueueDestroy(&q)?

- 作用:銷毀隊列,釋放隊列占用的所有內存(包括所有節點)。

- 必須在遍歷結束后調用(原代碼放在循環內是錯誤的,會導致第一次循環后隊列被銷毀,后續操

作失敗)。

注意 : 上面關于隊列的函數小編均在之前的文章中都有講過。想深入了解的小伙伴可以去看一看。

并且上面的代碼都是基于隊列和二叉樹的代碼基礎上實現。

5. 總結:

levelOrder??函數通過隊列實現二叉樹層序遍歷,核心總結如下:

1.?初始化隊列并將根節點入隊,作為遍歷起點;

2.?循環處理隊列(隊列非空時):

- 取出隊頭節點,訪問其數據(打印);

- 將該節點的非空左右子節點依次入隊(為下一層遍歷做準備);

3.?遍歷結束后銷毀隊列

簡言之,隊列的“先進先出”特性保證了節點按“一層一層、從左到右”的順序被訪問,是層序遍歷的

關鍵工具。

以上便是關于隊列實現層序遍歷二叉樹的全部內容。最后感謝大家的觀看!

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

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

相關文章

【橘子分布式】gRPC(番外篇-攔截器)

一、簡介 我們之前其實已經完成了關于grpc的一些基礎用法,實際上還有一些比較相對進階的使用方式。比如: 攔截器:包括客戶端和服務端的攔截器,進而在每一端都可以劃分為流式的攔截器和非流式的攔截器。和以前我們在spring web中的…

深入探索嵌入式仿真教學:以酒精測試儀實驗為例的高效學習實踐

引言:嵌入式技術普及下的教學革新 嵌入式系統作為現代科技的核心驅動力,其教學重要性日益凸顯。然而,傳統硬件實驗面臨設備成本高、維護難、時空受限等挑戰。如何突破這些瓶頸,實現高效、靈活、專業的嵌入式教學?本文將…

三種深度學習模型(GRU、CNN-GRU、貝葉斯優化的CNN-GRU/BO-CNN-GRU)對北半球光伏數據進行時間序列預測

代碼功能 該代碼實現了一個光伏發電量預測系統,采用三種深度學習模型(GRU、CNN-GRU、貝葉斯優化的CNN-GRU/BO-CNN-GRU)對北半球光伏數據進行時間序列預測對北半球光伏數據進行時間序列預測,并通過多維度評估指標和可視化對比模型性…

PostgreSQL對象權限管理

本文記述在postgreSQL中對用戶/角色操作庫、模式、表、序列、函數、存儲過程的權限管理針對數據庫的授權 授權:grant 權限 on database 數據庫 to 用戶/角色; 撤權:revoke 權限 on database 數據庫 from 用戶/角色; 針對模式的授權 授權:gran…

Wordpress主題配置

一、下載主題 主題下載地址:https://www.iztwp.com/tag/blog-theme 二、主題安裝 三、上傳主題安裝即可 四、安裝完成啟動主題

lock 和 synchronized 區別

1. 引言 在多線程編程中,我們經常需要確保某些代碼在同一時刻只由一個線程執行。這種機制通常叫做“互斥鎖”或“同步”。Java 提供了兩種主要的同步機制:synchronized 關鍵字和 Lock 接口。盡管它們的作用相似,都用于實現線程的同步&#xf…

Tkinter - Python圖形界面開發指南

作者:唐叔在學習 專欄:唐叔學python 標簽:Python GUI編程 Tkinter教程 圖形界面開發 Python實戰 界面設計 事件監聽 Python入門 唐叔Python 編程學習 軟件開發 文章目錄一、Tkinter是什么?為什么選擇它?二、Tkinter基礎…

Java基礎day15

目錄 一、Java集合簡介 1.什么是集合? 2.集合接口 3.小結 二、List集合 1.List集合簡介 三、ArrayList容器類 1.初始化 1.1無參初始化 1.2有參初始化 2.數據結構 3.常用方法 3.1增加元素 3.2查找元素 3.3 修改元素 3.4 刪除元素 3.5 其他方法 4.擴…

React Three Fiber 實現晝夜循環:從光照過渡到日月聯動的技術拆解

在 3D 場景中用 React Three Fiber 實現自然的晝夜循環,核心難點在于光照的平滑過渡、日月運動的聯動邏輯、晝夜狀態下的光影差異處理,以及性能與視覺效果的平衡。本文以一個 ReactThree.js 的實現為例,詳細解析如何通過三角函數計算日月位置…

進階向:基于Python的簡易屏幕畫筆工具

用Python打造你的專屬屏幕畫筆工具:零基礎也能輕松實現你是否曾在觀看網課或參加遠程會議時,想要直接在屏幕上標注重點?或者作為設計師,需要快速繪制創意草圖?現在,只需幾行Python代碼,你就能輕…

Elasticsearch-ik分析器

CLI 安裝步驟 1、停止 Elasticsearch(如果正在運行): 在安裝插件之前,確保 Elasticsearch 沒有在運行。 命令: systemctl stop elasticsearch2、安裝插件: 使用 elasticsearch-plugin 命令安裝 IK 插件。進…

MySQL八股篇

查詢關鍵字執行先后順序FROM(及 JOIN)WHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT / OFFSETCHAR 和 VARCHAR 的區別?使用場景?特性CHARVARCHAR?存儲方式??定長,存儲時填充空格至定義長度變長,存儲實際數據 長…

QT RCC 文件

RCC (Qt Resource Compiler) 是 Qt 框架中的一個工具,用于將資源文件(如圖像、音頻、翻譯文件等)編譯成二進制格式,并嵌入到應用程序可執行文件中。RCC 文件基本概念作用:將應用程序所需的資源文件編譯成 C 代碼&#…

數據湖典型架構解析:2025 年湖倉一體化解決方案

數據湖架構概述:從傳統模型到 2025 年新范式數據湖作為存儲海量異構數據的中央倉庫,其架構設計直接影響企業數據價值的釋放效率。傳統數據湖架構主要關注數據的存儲和管理,而 2025 年的數據湖架構已經演變為更加智能化、自動化的綜合性數據平…

繪圖庫 Matplotlib Search

關于Pathon的繪圖庫的認識和基本操作的學習 這里學習了兩款常用便捷的繪圖庫去學習使用Matplotlib介紹是最受歡迎的一種數據可視化包 是常用的2D繪圖庫 一般常于Numpy和Pandas使用 是數據分析中非常重要的工具可以自定義XY軸 繪制線形圖 柱狀圖 直方圖 密度圖 散點圖 更清晰的展…

Docker詳解及實戰

🎉 Docker 簡介和安裝 - Docker 快速入門 Docker 簡介 Docker是一個開源的平臺,用于開發、交付和運行應用程序。它能夠在Windows,macOS,Linux計算機上運行,并將某一應用程序及其依賴項打包至一個容器中,這…

嵌入式學習的第三十三天-進程間通信-UDP

一、網絡1.定義不同主機間進程通信主機間在硬件層面互聯互通主機在軟件層面互聯互通2.國際網絡體系結構OSI模型(7層): open system interconnect -------理論模型------定義了網絡通信中不同層的協議1977 國際標準化組織各種不同體系結構的計算機能在世…

4、Spring AI_DeepSeek模型_結構化輸出

一、前言 Spring AI 提供跨 AI 供應商(如 OpenAI、Hugging Face 等)的一致性 API, 通過分裝的ChatModel或ChatClient即可輕松調動LLM進行流式或非流式對話。 本專欄主要圍繞著通過OpenAI兼容接口調用各種大語言模型展開學習(因為大部分模型…

Spring Data Redis 從入門到精通:原理與實戰指南

一、Redis 基礎概念 Redis(Remote Dictionary Server)是開源的內存鍵值對數據庫,以高性能著稱。它支持多種數據結構(String、Hash、List、Set、ZSet),并提供持久化機制(RDB、AOF)。 …

免費版酒店押金原路退回系統——仙盟創夢IDE

項目介紹?東方仙盟開源酒店押金管理系統是一款面向中小型酒店、民宿、客棧的輕量級前臺管理工具,專注于簡化房態管理、訂單處理和押金跟蹤流程。作為完全開源的解決方案,它無需依賴任何第三方服務,所有數據存儲在本地瀏覽器中,確…