Java數據結構——樹

一、樹型結構

1.1 概念

我們之前提到的數組,單鏈表,棧和隊列都是一種線性結構,每個元素都有最多一個后繼節點。而樹型結構是一種非線性結構,它是由n(n>=0)節點組成的一個具有層次關系的集合。它之所以叫做樹型結構是因為它看起來像是一棵倒掛的樹,根向上,葉子朝下。

1.2 特點

  • 有一個特殊的結點,稱為根結點,根結點沒有前驅結點
  • 除根結點外,其余結點被分成M(M > 0)個互不相交的集合T1、T2、……、Tm,其中每一個集合Ti (1 <= i <=m) 又是一棵與樹類似的子樹。每棵子樹的根結點有且只有一個前驅,可以有0個或多個后繼
  • 樹是遞歸定義的,樹的子樹也滿足樹的定義

☆ 樹形結構中,子樹之間不能有交集,否則就不是樹型結構

二、樹

2.1 樹的相關概念

  • 結點的度:一個結點含有子樹的個數稱為該結點的度; 如上圖:A的度為3
  • 樹的度:一棵樹中,所有結點度的最大值稱為樹的度; 如上圖:樹的度為3
  • 葉子結點或終端結點:度為0的結點稱為葉結點; 如上圖:K,L,F,G,M,I,J節點為葉結點
  • 雙親結點或父結點:若一個結點含有子結點,則這個結點稱為其子結點的父結點; 如上圖:A是B的父結點,C是G的父節點
  • 孩子結點或子結點:一個結點含有的子樹的根結點稱為該結點的子結點; 如上圖:B是A的孩子結點,H是D的孩子節點
  • 根結點:一棵樹中,沒有雙親結點的結點;如上圖:A
  • 結點的層次:從根開始定義起,根為第1層,根的子結點為第2層,以此類推;如上圖:B節點在第二層,L節點在第四層
  • 樹的高度或深度:樹中結點的最大層次; 如上圖:樹的高度為4

樹的以下概念只需了解,在看書時只要知道是什么意思即可:

  • 非終端結點或分支結點:度不為0的結點; 如上圖:B、C、D、E...等節點為分支結點
  • 兄弟結點:具有相同父結點的結點互稱為兄弟結點; 如上圖:B、C、D是兄弟結點
  • 堂兄弟結點:雙親在同一層的結點互為堂兄弟;如上圖:E、G互為兄弟結點
  • 結點的祖先:從根到該結點所經分支上的所有結點;如上圖:A是所有結點的祖先
  • 子孫:以某結點為根的子樹中任一結點都稱為該結點的子孫。如上圖:所有結點都是A的子孫
  • 森林:由m(m>=0)棵互不相交的樹組成的集合稱為森林

2.2 樹的應用

文件系統管理

三、二叉樹

3.1 二叉樹的概念

我們在樹型結構中提到,一個父節點可以有多個孩子節點,但是在二叉樹中,一個父節點最多只能有兩個孩子節點,稱為左樹和右樹

我們可以看到

二叉樹不存在度大于2的節點

二叉樹的子樹有左右之分,次序不能顛倒,因此二叉樹是有序樹

這是兩個不同的二叉樹,因為二叉樹是有序樹,所以不可以把他們看成是同一個樹

3.2 兩種特殊的二叉樹

在二叉樹根據節點不同的位置有兩種特殊的二叉樹

1.滿二叉樹:一棵二叉樹,如果每層的節點數都達到了最大值,把每個位置都填滿了,則這棵二叉樹就是滿二叉樹。在數學層面上來說,如果一棵二叉樹的層數為k,節點數為2^{k}-1,那么這棵二叉樹就是滿二叉樹

2.完全二叉樹:完全二叉樹是效率很高的數據結構,完全二叉樹是由滿二叉樹而引出來的。對于深度為k的,有n個節點的二叉樹,當且僅當每個節點斗魚深度為K的滿二叉樹中編號從0至n-1的節點一一對應時稱之為完全二叉樹

用更通俗的話去解釋完全二叉樹就是,最后一層所有的節點都要靠左,不可以有空位,最后一層上面的節點要和滿二叉樹一樣鋪滿

3.3 二叉樹的性質

  1. 若規定根結點的層數為1,則一棵非空二叉樹的第i層上最多有2^{i-1} (i>0)個結點
  2. 若規定只有根結點的二叉樹的深度為1,則深度為K的二叉樹的最大結點數是2^{k}-1 (k>=0)
  3. 對任何一棵二叉樹, 如果其葉結點個數為 n0, 度為2的非葉結點個數為 n2,則有n0=n2+1
  4. 具有n個結點的完全二叉樹的深度k為 log2(n+1)上取整
  5. 對于具有n個結點的完全二叉樹,如果按照從上至下從左至右的順序對所有節點從0開始編號,則對于序號為i的結點有:
  • ?若i>0,雙親序號:(i-1)/2;i=0,i為根結點編號,無雙親結點
  • ?若2i+1<n,左孩子序號:2i+1,否則無左孩子
  • ?若2i+2<n,右孩子序號:2i+2,否則無右孩子

3.4 二叉樹的儲存

二叉樹的儲存結構分為:順序儲存和鏈式儲存

我們這里將鏈式儲存,順序儲存我們在之后的堆中會接觸到

二叉樹的鏈式儲存是通過一個一個的節點引用起來的,常見的表示方法有二叉和三叉表示方法

// 孩子表示法
class Node {int val; // 數據域Node left; // 左孩子的引用,常常代表左孩子為根的整棵左子樹Node right; // 右孩子的引用,常常代表右孩子為根的整棵右子樹
} 
// 孩子父親表示法
class Node {int val; // 數據域Node left; // 左孩子的引用,常常代表左孩子為根的整棵左子樹Node right; // 右孩子的引用,常常代表右孩子為根的整棵右子樹Node parent; // 當前節點的根節點
}

二叉表示法就是孩子表示法,節點儲存該節點的值和左孩子的地址和右孩子的地址

三叉表示法就是孩子父親表示法,節點除了儲存值和孩子的地址,還會儲存父親節點的地址

3.5 二叉樹的基本操作

3.5.1 二叉樹的前中序遍歷

前序遍歷就是先訪問根節點,再訪問根節點的左孩子,最后是根節點的右孩子。在訪問左孩子的時候依然是先訪問根節點,也就是剛剛我們提到的左孩子,再是左孩子的左孩子,最后是左孩子的右孩子。顯而易見,訪問每個節點的方法都是一樣的根左右,所以我們采用遞歸的方式進行遍歷

中序遍歷則是先訪問左孩子,再訪問根節點,最后是右孩子

后序遍歷則是先訪問左孩子,再訪問右孩子,最后是根節點

前中后序遍歷的代碼都是異曲同工,很好掌握

前序遍歷結構是:1 2 3 4 5 6

中序遍歷結構是:3 2 1 5 4 6

后序遍歷結構是:3 1 5 6 4 1

class Node{int val;Node left;Node right;
}
public class Test {// 前序遍歷void preOrder(Node root){if(root==null) return;System.out.println(root.val);preOrder(root.left);preOrder(root.right);}// 中序遍歷void inOrder(Node root){if(root==null) return;inOrder(root.left);System.out.println(root.val);inOrder(root.right);}// 后序遍歷void postOrder(Node root){if(root==null) return;postOrder(root.left);postOrder(root.right);System.out.println(root.val);}}

3.5.2 二叉樹的層序遍歷

層序遍歷就是從第一層開始,從左到右,從上到下依次訪問節點,我們采用隊列來實現層序遍歷。先在隊列中加入根節點,然后進入循環,只要隊列不為空就先刪除隊頭節點并保存,再打印隊頭節點的值,之后加入該節點的左孩子和右孩子

   public void levelOrder(TreeNode root) {if(root == null) {return;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {TreeNode cur = queue.poll();System.out.print(cur.val+" ");if(cur.left != null) {queue.offer(cur.left);}if(cur.right != null) {queue.offer(cur.right);}}}

3.5.3 二叉樹的常用操作

    //獲取當前二叉樹的節點個數public int getNodeSize2(TreeNode root) {if(root == null) return 0;return getNodeSize2(root.left) +getNodeSize2(root.right) + 1;}//獲取葉子節點的個數public int getLeafNodeCount2(TreeNode root) {if(root == null) {return 0;}if(root.left == null && root.right == null) {return 1;}return getLeafNodeCount2(root.left) +getLeafNodeCount2(root.right);}//第K層節點的個數public int getKLevelNodeCount(TreeNode root,int k) {if(root == null) {return 0;}if(k == 1) {return 1;}return getKLevelNodeCount(root.left,k-1) +getKLevelNodeCount(root.right,k-1);}//二叉樹的高度public int getHeight(TreeNode root) {if(root == null) return 0;int leftHeight = getHeight(root.left);int rightHeight = getHeight(root.right);return Math.max(leftHeight,rightHeight) + 1;}//查找是否有key值的節點public TreeNode find(TreeNode root,char key) {if(root == null) {return null;}if(root.val == key) {return root;}TreeNode leftResult = find(root.left,key);if(leftResult != null) {return leftResult;}TreeNode rightResult = find(root.right,key);if(rightResult != null) {return rightResult;}return null;}//判斷樹是否為完全二叉樹public boolean isCompleteTree(TreeNode root) {if(root == null) return true;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {TreeNode cur = queue.poll();if(cur != null) {queue.offer(cur.left);queue.offer(cur.right);}else {break;}}while (!queue.isEmpty()) {TreeNode cur = queue.peek();if(cur == null) {queue.poll();}else {return false;}}return true;}

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

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

相關文章

基于LLM的月全食時空建模與智能預測:從天文現象到深度學習融合

當古老的天文學遇上現代人工智能,會碰撞出怎樣的火花? 一、當月球遇見AI 月全食,這一令人驚嘆的天文現象,自古以來就吸引著無數天文學家和愛好者的目光。當地球恰好運行到太陽和月球之間,完全遮擋太陽光時,我們就能目睹月球逐漸被"吞噬"然后又重煥光彩的奇妙…

LeetCode熱題 42.接雨水

題目 思路&#xff1a; 通過畫圖觀察我們其實可以很容易發現&#xff0c;每個柱子接多少水由這個地方左邊最高的柱子和右邊最高的柱子確定&#xff0c;因為總要形成一個坑嘛&#xff0c;然后就能接著確定&#xff1a; 當前柱子接水量 min(左邊最高柱子的高度, 右邊最高柱子的…

PostgreSQL與Greenplum數據庫的編程語言連接

編程語言連接數據庫 目前數據庫一般支持HA的連接&#xff0c;即一個Coordinator內的一個節點異常后會鏈接到另外的一個節點&#xff0c;不會影響業務的正常運行。在JDBC配置時需要采用 高可用鏈接字符串(Connection URL/DSN) 的方式連接。適用于不同的編程語言中使用&#xff…

后端(JDBC)學習筆記(CLASS 1):基礎篇(一)

一、引言1、數據的存儲開發java程序的時候&#xff0c;數據都是存儲在內存中&#xff0c;屬于臨時存儲&#xff0c;當程序停止或重啟時&#xff0c;內存中的數據就丟失了。為了解決數據的長期存儲問題&#xff0c;有如下解決方案&#xff1a;1、數據通過I/O流技術&#xff0c;存…

卷對卷(Roll-to-Roll,R2R)技術的應用領域和技術進展

目錄&#xff1a;第一節&#xff1a;卷對卷技術及其應用領域和工藝要求一、卷對卷技術發展現概述二、卷對卷研發和規模化應用難點重點和發展趨勢三、卷對卷工藝主要應用領域及工藝要求第二節&#xff1a;卷對卷生產工藝參數及質量控制四、卷對卷生產工藝控制參數和條件五、卷對…

【Ansible】管理變量和事實知識點

1.Ansible變量名由什么組成&#xff1f;答&#xff1a;變量名必須以字母開頭&#xff0c;且只能含有字母、數字和下劃線。2.定義變量的方法及變量的優先級&#xff1f;答&#xff1a;按優先級從低到高排列: 在清單中定義的組變量 < 在清單或playbook所在目錄的group_vars子目…

基于SpringBoot的天氣預報系統的設計與實現

源碼鏈接&#xff1a;點擊下載源碼 相關文檔&#xff1a;點擊下載相關文檔 摘 要 隨著科技的飛速發展和人們生活水平的不斷提高&#xff0c;天氣預報已成為現代社會不可或缺的一部分。無論是日常生活出行、農業生產安排&#xff0c;還是航空、海運等交通領域&#xff0c;準確…

算法(keep learning)

基礎算法 背模板加刷題 排序快排 主要思想&#xff1a;分治 第一步&#xff1a;確認一個分界點&#xff0c;比如起點&#xff0c;中間點&#xff08;分界點&#xff09;&#xff0c;末點第二步&#xff1a;調整區間&#xff0c;使得第一個區間的數都小于等于分界點&#xff0c;…

Django項目架構

背景&#xff1a;很多人寫 Django 時容易“什么都往 views 里塞”&#xff0c;結果項目一大就亂套了。需要把 視圖層 / 業務層 / 數據層 等職責清晰分出來。圖解說明Client&#xff1a;瀏覽器 / App / 前端調用 API。urls.py&#xff1a;定義 API 路由&#xff0c;把請求分發到…

MySQL】從零開始了解數據庫開發 --- 表的操作

永遠記住&#xff0c;你的存在是有意義的&#xff0c; 你很重要&#xff0c; 你是被愛著的&#xff0c; 而且你為這個世界帶來了無可取代的東西。 -- 麥克西 《男孩、鼴鼠、狐貍和馬》-- 從零開始了解數據庫開發創建數據表查看表結構修改數據表結構重命名表復制表刪除表今天我們…

MySQL底層架構設計原理詳細介紹

文章目錄一、MySQL體系結構概覽二、連接層&#xff08;Connection Layer&#xff09;1. 連接器&#xff08;Connectors&#xff09;2. 連接池&#xff08;Conncction Pool&#xff09;三、服務層&#xff08;Server Layer&#xff09;1. SQL接口組件&#xff08;SQL Interface&…

QB/T 4674-2021 汽車內裝飾用聚氨酯束狀超細纖維合成革檢測

汽車內飾品聚氨酯束狀超細纖維合成革是指以海島型雙組份或多組分纖維加工成飛織造布&#xff0c;再經水性聚氨酯樹脂或溶劑型聚氨酯樹脂浸漬、濕法凝固、溶劑或堿液萃取及后整理等工藝制成的汽車內裝飾皮革。QB/T 4674-2021 汽車內裝飾用聚氨酯束狀超細纖維合成革檢測項目測試項…

QML和Qt Quick

QML和Qt Quick QML 和 Qt Quick 是 Qt 框架中緊密相關但概念不同的兩個部分&#xff0c;它們之間的關系可以用如下方式清晰說明&#xff1a; 核心區別概覽??特性????QML????Qt Quick????本質??聲明式編程??語言??基于 QML 的??框架/庫????作用??定…

JavaScript 結構型設計模式詳解

1. 代理模式1.1. 使用場景代理模式在不改變原始對象的前提下&#xff0c;通過代理對象控制對其訪問&#xff0c;通常用于權限控制、延遲加載、遠程調用等場景。在前端開發中&#xff0c;可以通過代理模式對網絡請求、緩存機制等進行控制。1.2. 代碼實現class ApiService {reque…

攝像頭模塊在運動相機中的特殊應用

運動相機作為記錄高速運動場景的專用設備&#xff0c;其攝像頭模塊的設計與普通消費電子產品存在顯著差異。根據行業資料和技術發展&#xff0c;攝像頭模塊在運動相機中的特殊應用主要體現在以下五個維度&#xff1a;一、極端環境適應性設計運動相機的攝像頭模塊針對戶外運動場…

SpringBoot + MinIO/S3 文件服務實現:FileService 接口與 FileServiceImpl 詳解

在企業項目中&#xff0c;文件上傳和管理是非常常見的需求。本文基于 芋道源碼 的實現&#xff0c;介紹如何封裝一個通用的 文件服務 FileService&#xff0c;支持&#xff1a;文件上傳&#xff08;保存數據庫記錄 存儲文件到 S3/MinIO 等對象存儲&#xff09;文件下載與刪除文…

Oracle RAC認證矩陣:規避風險的關鍵指南

RAC Certification Matrix&#xff08;RAC認證矩陣&#xff09; 是Oracle官方發布的硬件、軟件與操作系統兼容性清單&#xff0c;明確規定了哪些平臺、組件和版本可以正式支持Oracle RAC&#xff08;Real Application Clusters&#xff09;的部署。它是搭建或升級RAC環境時必須…

【自然語言處理與大模型】如何通過微調來agent性能?

雖然大模型本身具備一定的指令理解和工具調用潛力&#xff0c;但在實際應用中&#xff0c;尤其是在復雜或專業領域&#xff0c;往往需要通過微調來提升Agent的工具調用能力。問題一&#xff1a;基座模型無法準確識別或選擇特定領域的工具當Agent需要在醫療、金融、法律、工業控…

在 Keil 中將 STM32 工程下載到 RAM 進行調試運行

在 Keil 中將 STM32 工程下載到 RAM 進行調試運行 在使用 STM32 進行調試時&#xff0c;默認情況下代碼會被燒寫到 Flash 中運行。然而&#xff0c;Flash 寫入速度較慢&#xff0c;擦寫次數有限&#xff0c;且調試過程中頻繁燒寫可能影響開發效率。在某些場景下&#xff08;如快…

【51單片機】【protues仿真】基于51單片機寵物投食系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、LCD1602液晶顯示時間、溫度、食物重量 2、按鍵手動投喂食物? 3、稱重模塊檢測當前食物重量 4、食物重量小于閾值會聲光警報并自動投喂 二、使用步驟 基于51單片機的寵物投食…