[leetcode] 面試經典 150 題——篇9:二叉樹(番外:二叉樹的遍歷方式)

二叉樹的遍歷是指按照某種順序訪問二叉樹中的每個節點。常見的遍歷方式有四種:前序遍歷(Pre-order Traversal)中序遍歷(In-order Traversal)后序遍歷(Post-order Traversal)以及層序遍歷(Level-order Traversal)。每種遍歷方式根據訪問根節點的時機不同而有所區別。


概述

前序遍歷(Pre-order Traversal)

在前序遍歷中,首先訪問根節點,然后遞歸地以前序方式遍歷左子樹,最后遞歸地以前序方式遍歷右子樹。即訪問順序為:根 -> 左 -> 右

  • 算法步驟:
    • 訪問根節點。
    • 對根節點的左子樹進行前序遍歷。
    • 對根節點的右子樹進行前序遍歷。

中序遍歷(In-order Traversal)

在中序遍歷中,首先遞歸地中序遍歷左子樹,然后訪問根節點,最后遞歸地中序遍歷右子樹。即訪問順序為:左 -> 根 -> 右

  • 算法步驟:
    • 對根節點的左子樹進行中序遍歷。
    • 訪問根節點。
    • 對根節點的右子樹進行中序遍歷。

對于二叉查找樹(BST),中序遍歷將返回按升序排列的節點值


后序遍歷(Post-order Traversal)

在后序遍歷中,首先遞歸地以后序方式遍歷左子樹,然后遞歸地以后序方式遍歷右子樹,最后訪問根節點。即訪問順序為:左 -> 右 -> 根

  • 算法步驟:
    • 對根節點的左子樹進行后序遍歷。
    • 對根節點的右子樹進行后序遍歷。
    • 訪問根節點。

層序遍歷(Level-order Traversal)

層序遍歷又稱廣度優先遍歷(BFS, Breadth-first Search),是按照從上到下、從左到右的順序逐層訪問樹中的所有節點。與前面三種遍歷方法不同的是,它不是遞歸實現的,而是通常使用隊列來輔助完成。

  • 算法步驟:
    • 創建一個隊列并將根節點加入隊列。
    • 當隊列非空時,重復以下操作:
      • 出隊并訪問隊首節點。
      • 將訪問節點的左孩子和右孩子依次入隊(如果存在的話)。

每種遍歷方式都有其特定的應用場景,例如,前序遍歷常用于復制樹,中序遍歷用于二叉查找樹的排序輸出,后序遍歷可用于刪除或釋放節點資源,而層序遍歷則有助于找到最短路徑等問題。


例子

示例二叉樹

假設我們有以下二叉樹:

        1/ \2   3/ \   \4   5   6
  • 根節點是 1
  • 左子樹的根是 2,右子樹的根是 3
  • 節點 2 的左孩子是 4,右孩子是 5
  • 節點 3 的右孩子是 6

前序遍歷

訪問順序:根 -> 左 -> 右

[1, 2, 4, 5, 3, 6]

代碼實現:

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef pre_order_traversal(root):result = []def traverse(node):if not node:returnresult.append(node.val)  # 訪問根節點traverse(node.left)      # 遍歷左子樹traverse(node.right)     # 遍歷右子樹traverse(root)return result# 構建二叉樹
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.right = TreeNode(6)
print(pre_order_traversal(root))  # 輸出: [1, 2, 4, 5, 3, 6]

中序遍歷

訪問順序:左 -> 根 -> 右

[4, 2, 5, 1, 3, 6]

代碼實現:

def in_order_traversal(root):result = []def traverse(node):if not node:returntraverse(node.left)      # 遍歷左子樹result.append(node.val)  # 訪問根節點traverse(node.right)     # 遍歷右子樹traverse(root)return resultprint(in_order_traversal(root))  # 輸出: [4, 2, 5, 1, 3, 6]

后序遍歷

訪問順序:左 -> 右 -> 根

[4, 5, 2, 6, 3, 1]

代碼實現:

def post_order_traversal(root):result = []def traverse(node):if not node:returntraverse(node.left)      # 遍歷左子樹traverse(node.right)     # 遍歷右子樹result.append(node.val)  # 訪問根節點traverse(root)return resultprint(post_order_traversal(root))  # 輸出: [4, 5, 2, 6, 3, 1]

層序遍歷

訪問順序:從上到下、從左到右逐層訪問

[1, 2, 3, 4, 5, 6]

代碼實現:

from collections import dequedef level_order_traversal(root):if not root:return []result = []queue = deque([root])  # 初始化隊列,根節點入隊while queue:node = queue.popleft()  # 出隊并訪問當前節點result.append(node.val)if node.left:  # 如果左孩子存在,入隊queue.append(node.left)if node.right:  # 如果右孩子存在,入隊queue.append(node.right)return resultprint(level_order_traversal(root))  # 輸出: [1, 2, 3, 4, 5, 6]

總結

遍歷方式訪問順序示例結果
前序遍歷根 -> 左 -> 右[1, 2, 4, 5, 3, 6]
中序遍歷左 -> 根 -> 右[4, 2, 5, 1, 3, 6]
后序遍歷左 -> 右 -> 根[4, 5, 2, 6, 3, 1]
層序遍歷按層從左到右[1, 2, 3, 4, 5, 6]

不同遍歷方式適用于不同的場景,例如:

  • 前序遍歷:用于復制樹、序列化樹。
  • 中序遍歷:用于二叉查找樹的排序輸出。
  • 后序遍歷:用于刪除樹或釋放資源。
  • 層序遍歷:用于尋找最短路徑或按層級處理節點。

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

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

相關文章

es基本概念

Elasticsearch 的架構與基本概念 Elasticsearch(簡稱 ES)是一個開源的分布式搜索和分析引擎,基于 Apache Lucene 構建。它被廣泛用于全文搜索、日志分析、實時數據分析等場景。以下是其架構概述及其基本概念的詳細解釋。 Elasticsearch 的架…

《星環之城:量子迷霧下的網絡安全戰記》

點擊下面圖片帶您領略全新的嵌入式學習路線 🔥爆款熱榜 88萬閱讀 1.6萬收藏 序章:星環之隕 公元2145年,人類在火星軌道上建造了“星環之城”——一座由量子網絡連接的太空城邦。它的中樞AI“蓋婭”掌控著地球與殖民地的數據洪流&#xff…

《全棧+雙客戶端Turnkey方案》架構設計圖

今天分享一些全棧雙客戶端Turnkey方案的架構與結構圖。 1:三種分布式部署方案:網關方案,超級服務器單服方案,直連邏輯服方案 2: 單服多線程核心架構: 系統服務邏輯服服務 3: 系統服務的多線程池調度設計 4:LogicServer Update與ECS架構&…

打破界限:Android XML與Jetpack Compose深度互操作指南

在現有XML布局項目中逐步引入Jetpack Compose是現代Android開發的常見需求。本指南將全面介紹混合使用的最佳實踐、技術細節和完整解決方案。 一、基礎配置 1.1 Gradle配置 android {buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion "1.5.3…

React-narice安卓打包流程

**1. 生成簽名密鑰 在項目的 android/app 目錄下生成簽名密鑰的步驟: 打開終端或命令提示符:導航到您的 React Native 項目的 android/app 目錄。 運行以下命令生成密鑰庫文件: keytool -genkeypair -v -keystore my-release-key.keystor…

嵌入式AI開源生態指南:從框架到應用的全面解析

嵌入式AI開源生態指南:從框架到應用的全面解析 引言 隨著人工智能技術的迅速發展,將AI能力部署到邊緣設備上的需求日益增長。嵌入式AI通過在資源受限的微控制器上運行機器學習模型,實現了無需云連接的本地智能處理,大幅降低了延…

深度學習中模型量化那些事

在深度學習中模型量化可以分為3塊知識點,數據類型、常規模型量化與大模型量化。本文主要是對這3塊知識點進行淺要的介紹。其中數據類型是模型量化的基本點。常規模型量化是指對普通小模型的量化實現,通常止步于int8的量化,絕大部分推理引擎都…

Redis-list類型

這里只是介紹命令使用 列表是用來存儲多個有序的字符串 可以用來充當棧和隊列的角色 列表特點: 列表中的元素是有序的,可以通過索引下標來獲取某個元素或者某個范圍的元素 獲取和刪除有區別 元素可以重復 命令 LPUSH 將一個或者多個元素從左側放入到list中(頭插法) lp…

Business English Certificates (BEC) 高頻詞匯背誦

Business English Certificates {BEC} 高頻詞匯背誦 References Cambridge English: Business Certificates, also known as Business English Certificates (BEC), are a suite of three English language qualifications for international business. abandon /??bnd?n/ …

第十四屆藍橋杯省賽真題解析(含C++詳細源碼)

第十四屆藍橋杯省賽 整數刪除滿分思路及代碼solution1 (40% 雙指針暴力枚舉)solution 2(優先隊列模擬鏈表 AC) 冶煉金屬滿分代碼及思路 子串簡寫滿分思路及代碼solution 1(60% 雙指針)solution 2&#xff0…

AI Agent開發大全第二十一課-如何開發一個MCP(從0開發一個MCP Client)

開篇 上一章《AI Agent開發大全第二十課-如何開發一個MCP(從0開發一個MCP Server)》里我們講了如何從0開始開發一個MCP Server。可以看到文中大量細節為MCP發明者官網Claude都不曾或者是遺漏的,而且還有那么多點遺漏,想要真正要在企業生產級環境使用MCP是需要做分布式開發的…

TypeScript面試題集合【初級、中級、高級】

初級面試題 什么是TypeScript? TypeScript是JavaScript的超集,由Microsoft開發,它添加了可選的靜態類型和基于類的面向對象編程。TypeScript旨在解決JavaScript的某些局限性,比如缺乏靜態類型和基于類的面向對象編程&#xff0c…

無錫無人機駕駛證培訓費用

無錫無人機駕駛證培訓費用,隨著科技的迅速發展,無人機在眾多行業中發揮著舉足輕重的作用。從影視制作到農業監測,再到物流運輸與城市規劃,無人機的應用場景不斷擴展,因此越來越多的人開始意識到學習無人機駕駛技能的重…

2181、合并零之間的節點

2181、[中等] 合并零之間的節點 1、問題描述: 給你一個鏈表的頭節點 head ,該鏈表包含由 0 分隔開的一連串整數。鏈表的 開端 和 末尾 的節點都滿足 Node.val 0 。 對于每兩個相鄰的 0 ,請你將它們之間的所有節點合并成一個節點&#xff…

相機的曝光和增益

文章目錄 曝光增益增益原理主要作用增益帶來的影響增益設置與應用 曝光 參考:B站優致譜視覺 增益 相機增益是指相機在拍攝過程中對圖像信號進行放大的一種操作,它在提高圖像亮度和增強圖像細節方面起著重要作用,以下從原理、作用、影響以…

小飛電視 2.7.0 | 高清秒播無卡頓的電視直播軟件

小飛電視采用了流行的天光YY殼進行二次開發,內置了熱門的肥羊源。更新后在加載速度和播放速度上有了顯著提升,并提供了豐富的內容和各種分類欄目,包括4K和8K頻道以及經典的直播內容如虎芽、斗魚、歪歪等。該軟件的最大特點是其穩定性和無廣告…

【Python爬蟲高級技巧】BeautifulSoup高級教程:數據抓取、性能調優、反爬策略,全方位提升爬蟲技能!

大家好,我是唐叔!上期我們聊了 BeautifulSoup的基礎用法 ,今天帶來進階篇。我將分享爬蟲老司機總結的BeautifulSoup高階技巧,以及那些官方文檔里不會告訴你的實戰經驗! 文章目錄 一、BeautifulSoup性能優化技巧1. 解析…

【愚公系列】《高效使用DeepSeek》055-可靠性評估與提升

??【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】?? ??開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! ?? 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"…

C# Winform 入門(12)之制作簡單的倒計時

倒計時效果展示 控件展示 以下均是使用label來形成的 label 的 BorderStyle:Fixed3D ForeColor:Red Blackground:Black label 的屬性 Name: txtyear txtmonth txtday txttime txtweek txtDays txtHour txtM…

edge webview2 runtime跟Edge瀏覽器軟件安裝包雙擊無反應解決方法

軟件安裝報錯問題有需要遠程文章末尾獲取聯系方式,可以幫你遠程處理各類安裝報錯。 一 、edge webview2 runtime跟Edge瀏覽器軟件安裝包雙擊無反應 在安裝edge webview2 runtime跟Edge瀏覽器雙擊無反應沒有出現安裝界面。這個可能是 新版本的Edge WebView2 Runti…