【數據結構】樹與森林

目錄

樹的存儲方法

雙親表示法

孩子表示法

孩子兄弟表示法

樹、森林與二叉樹的轉換

樹轉換成二叉樹

森林轉換成二叉樹

二叉樹轉換成森林

樹與森林的遍歷

樹的遍歷

森林的遍歷


樹的存儲方法

雙親表示法

這種存儲結構采用一組連續空間來存儲每個結點,同時在每個結點中增設一個偽指針,指示其雙親結點在數組中的位置,根結點下標為0,其偽指針域為-1。

孩子表示法


孩子表示法是將每個結點的孩子結點視為一個線性表,且以單鏈表作為存儲結構,則n個結點就有n個孩子鏈表(葉結點的孩子鏈表為空表)。而n個頭指針又組成一個線性表,為便于查找,可采用順序存儲結構。

孩子兄弟表示法

孩子兄弟表示法又稱二叉樹表示法,即以二叉鏈表作為樹的存儲結構。孩子兄弟表示法使每個結點包括三部分內容:結點值、指向結點第一個孩子結點的指針,以及指向結點下一個兄弟結點的指針,其中左指針指向第一個孩子,右指針指向第一個兄弟。

孩子兄弟表示法比較靈活,其最大的優點是可以方便地實現樹轉換為二叉樹的操作,易于查找結點的孩子等,但缺點是從當前結點查找其雙親結點比較麻煩。若為每個結點增設一個parent域指向其父結點,則查找結點的父結點也很方便。

孩子兄弟表示法代碼如下:

typedef struct CSNode{int data;struct CSNode *firstchild, *nextsibling;
}CSNode,*CSTree;

樹、森林與二叉樹的轉換

樹轉換成二叉樹

樹轉換為二叉樹的規則是:每個節點的左指針指向它的第一個孩子,右指針指向它在樹中的相鄰右兄弟。這種規則也被稱為“左孩子右兄弟”表示法。由于根節點在樹中沒有兄弟,因此樹轉換得到的二叉樹的根節點沒有右子樹。

將樹轉換為二叉樹的畫法可以按照以下步驟進行:

1. 在兄弟節點之間加連線:對于樹中的每個節點,將其所有子節點(即兄弟節點)之間用線連接起來。
2. 保留第一個孩子的連線,刪除其他孩子的連線:對于每個節點,只保留它與第一個孩子的連線,而刪除與其他子節點的連線。
3.順時針旋轉 45°:以樹的根節點為軸心,將整個結構順時針旋轉 45°,使得轉換后的二叉樹符合“左孩子右兄弟”的規則。

示例如下:

森林轉換成二叉樹

將森林轉換為二叉樹的規則與樹轉換為二叉樹類似,具體步驟如下:

1. 先將森林中的每棵樹分別轉換為二叉樹,轉換規則遵循“左孩子右兄弟”原則,即每個節點的左指針指向其第一個孩子,右指針指向其相鄰的右兄弟。
2. 連接各二叉樹:由于每棵樹轉換為二叉樹后,其右子樹必定為空,因此可以將森林中第二棵樹的根節點視為第一棵樹根節點的右兄弟,即將第二棵樹對應的二叉樹作為第一棵二叉樹根的右子樹;同理,將第三棵樹對應的二叉樹作為第二棵二叉樹根的右子樹,依次類推,最終將整個森林連接成一棵二叉樹。

二叉樹轉換成森林

二叉樹轉換為森林的規則如下:

1. 確定第一棵樹:如果二叉樹非空,那么二叉樹的根節點及其左子樹對應森林中的第一棵樹。因此,需要將根節點的右鏈斷開。
2. 遞歸處理剩余部分:斷開右鏈后,二叉樹根的右子樹可以看作是由森林中除第一棵樹之外的其余樹轉換而來的二叉樹。對這個右子樹重復上述操作,即繼續斷開右鏈,提取下一顆樹,直到最后只剩下一棵沒有右子樹的二叉樹為止。
3.轉換為樹:將每棵提取出的二叉樹依次轉換為樹。最終,這些樹組合起來就是原森林。

二叉樹轉換為樹或森林的過程是唯一的。

樹與森林的遍歷

樹的遍歷

樹的遍歷是指按照某種順序訪問樹中的每個節點,并且每個節點只被訪問一次。主要的遍歷方式有兩種:

先根遍歷

  1. 如果樹非空,先訪問根節點。
  2. 然后依次遍歷根節點的每棵子樹,在遍歷子樹時仍然按照“先根后子樹”的規則進行。
  3. 先根遍歷的序列與這棵樹轉換為二叉樹后的先序遍歷序列相同。

后根遍歷

  1. 如果樹非空,先依次遍歷根節點的每棵子樹,在遍歷子樹時仍然按照“先子樹后根”的規則進行。
  2. 遍歷完所有子樹后,再訪問根節點。
  3. 后根遍歷的序列與這棵樹轉換為二叉樹后的中序遍歷序列相同。

森林的遍歷

森林的遍歷方法基于森林和樹的遞歸定義,主要有兩種遍歷方式:

先序遍歷森林

  1. 如果森林非空,先訪問森林中第一棵樹的根節點。
  2. 然后先序遍歷第一棵樹中根節點的子樹森林(即第一棵樹的子樹部分)。
  3. 最后,先序遍歷除去第一棵樹之后剩余的樹構成的森林。

中序遍歷森林

  1. 如果森林非空,先中序遍歷森林中第一棵樹的根節點的子樹森林(即第一棵樹的子樹部分)。
  2. 然后訪問第一棵樹的根節點。
  3. 最后,中序遍歷除去第一棵樹之后剩余的樹構成的森林。

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

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

相關文章

html5基于Canvas的動態時鐘實現詳解

基于Canvas的動態時鐘實現詳解 這里寫目錄標題 基于Canvas的動態時鐘實現詳解項目介紹技術棧項目架構HTML結構核心樣式設計 核心功能實現1. 時鐘表盤繪制2. 時鐘指針動畫3. 主題切換實現4. 時間格式切換 技術要點總結項目亮點總結參考資料 項目介紹 在這篇文章中,我…

Deepseek API+Python 測試用例一鍵生成與導出 V1.0.3

** 功能詳解** 隨著軟件測試復雜度的不斷提升,測試工程師需要更高效的方法來設計高覆蓋率的測試用例。Deepseek API+Python 測試用例生成工具在 V1.0.3 版本中,新增了多個功能點,優化了提示詞模板,并增強了對文檔和接口測試用例的支持,極大提升了測試用例設計的智能化和易…

react如何引用(按需加載)百度地圖,并結合and組件化封裝

1.技術選項: vitereactantdesign load-script 2.實現思路: 1.按需加載如何實現? 要實現按需加載就不能直接在項目的入口文件這種地方去通過script標簽引入,這里使用load-script封裝了一個加載百度地圖的Bmap.js方法,實現動態的插入script腳本。 根…

LeetCode 第31~33題

目錄 LeetCode 第31題:下一個排列 LeetCode 第32題:最長有效括號 LeetCode 第33題:搜索旋轉排序數組 LeetCode 第31題:下一個排列 題目描述 整數數組的一個排列就是將所有成員以序列或線性順序排列。例如arr[1,2,3],以…

虛擬現實--->unity學習

前言:這學期勞動課選了虛擬現實,其中老師算挺認真的,當然對一些不感興趣的同學來說是一種折磨,我對這個unity的學習以及后續的虛幻引擎剛開始連基礎的概念都沒有,后面漸漸也是滋生了一些興趣,用這篇博客記錄…

在Trae中設置Python解釋器版本

Python 是一種廣泛使用的高級編程語言,因其簡潔易讀的語法和強大的功能而備受歡迎。隨著 Python 的不斷發展,多個版本相繼發布,每個版本都帶來了新特性和改進。然而,這也帶來了一些問題,比如不同的工程,需要…

鴻蒙原生開發之狀態管理V2

一、ArkTS狀態變量的定義: State:狀態,指驅動UI更新的數據。用戶通過觸發組件的事件方法,改變狀態數據。狀態數據的改變,引起UI的重新渲染。 在鴻蒙原生開發中,使用ArkTS開發UI的時候,我們可以…

nginx配置跳轉設置Host有誤導致報404問題

我們有個項目,前端調用了第三方接口。為了避免跨域,所以使用nginx進行轉發。一直正常工作,相安無事。近日第三方調整了安全策略,http轉換成https,原本使用ip,現在也改成使用域名,所以nginx這里我…

深度學習 Deep Learning 第12章 深度學習的主流應用

深度學習 Deep Learning 第12章 深度學習的主流應用 內容概要 本周深入探討了深度學習在多個領域的應用,包括計算機視覺、語音識別、自然語言處理以及其他領域如推薦系統和知識表示。本章強調了硬件和軟件基礎設施的重要性,特別是GPU在加速神經網絡訓練…

【Qt】三種操作sqlite3的方式及其三種多表連接

一、sqlite3與MySQL數據庫區別: 1. 數據庫類型 SQLite3:是嵌入式數據庫,它將整個數據庫存儲在單個文件中,不需要獨立的服務器進程。這意味著它可以很方便地集成到各種應用程序中,如移動應用、桌面應用等。MySQL&…

mysqlworkbench導入.sql文件

1、MySQL Workbench 新建數據庫 或者 在左側導航欄的 ?Schemas 區域右鍵選擇 ?Create Schema...輸入數據庫名稱(例如 mydatabase),點擊 ?Apply確認創建,點擊 ?Finish 2、選擇目標數據庫 在左側導航欄的 ?Schemas 列表中&a…

《Spring Cloud Eureka 高可用集群實戰:從零構建高可靠性的微服務注冊中心》

從零構建高可用 Eureka 集群 | Spring Cloud 微服務架構深度實踐指南 本文核心內容基于《Spring Cloud 微服務架構開發》第1版整理,結合生產級實踐經驗優化 實驗環境:IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich…

實變函數:集合與子集合一例(20250329)

題目 設 r , s , t r, s, t r,s,t 是三個互不相同的數,且 A { r , s , t } A \{r, s, t\} A{r,s,t}, B { r 2 , s 2 , t 2 } B \{r^2, s^2, t^2\} B{r2,s2,t2}, C { r s , s t , r t } C \{rs, st, rt\} C{rs,st,rt} 若 A B C A B C ABC 則 { r , s…

Redis設計與實現-哨兵

哨兵模式 1、啟動并初始化sentinel1.1 初始化服務器1.2 使用Sentinel代碼1.3 初始化sentinel狀態1.4 初始化sentinel狀態的master屬性1.5 創建連向主服務器的網絡連接 2、獲取主服務器信息3、獲取從服務器的信息4、向主從服務器發送信息5、接受主從服務器的頻道信息6、檢測主觀…

藍橋杯省模擬賽 字符串拼接

問題描述 給定四個字符串 a,b,c,d,請將這四個字符串按照任意順序依次連接拼成一個字符串。 請問拼成的字符串字典序最小是多少? 輸入格式 輸入四行,每行包含一個字符串。 輸出格式 輸出一行包含一個字符串,表示答案。 樣例…

【大前端系列20】JavaScript核心:項目實戰從零構建任務管理系統

JavaScript核心:項目實戰從零構建任務管理系統 系列: 「全棧進化:大前端開發完全指南」系列第20篇 核心: 將JavaScript異步編程、事件循環等核心知識應用于實際項目開發 📌 引言 在前面的文章中,我們深入探討了JavaScript中的異步…

STM32單片機的桌面寵物機器人(基于HAL庫)

效果 基于STM32單片機的桌面寵物機器人 概要 語音模塊:ASR PRO,通過天問block軟件燒錄語音指令 主控芯片:STM32F103C8T6 使用HAL庫 屏幕:0.96寸OLED屏,用來顯示表情 4個舵機,用來當作四只腿 底部一個面…

計算機視覺初步(環境搭建)

1.anaconda 建議安裝在D盤,官網正常安裝即可,一般可以安裝windows版本 安裝成功后,可以在電腦應用里找到: 2.創建虛擬環境 打開anaconda prompt, 可以用conda env list 查看現有的環境,一般打開默認bas…

SQL Server數據庫引擎服務啟動失敗:端口沖突

問題現象: SQL Server 2022 安裝完成后,數據庫引擎服務無法啟動,日志報錯 “TCP 端口 1433 已被占用”(ERROR_LOG_SYS_TCP_PORT)。 快速診斷 檢測端口占用: # 查看 1433 端口占用情況(需管理員權…

全局思維與系統思考

最近接到一些需求,1號位希望每個層級的領導者有眼界,胸懷,格局,全局觀,這些聽起來似乎很抽象,然而它們是每個人、每個團隊成長與成功的核心競爭力。那么,如何才能提升這些能力?就像我…