數據結構第8問:什么是樹?

【本節僅描述樹的定義、術語以及相關性質】

定義

樹是由若干個結點組成的有限集合。具有如下特征:

  1. 有且僅有一個根結點;
  2. 除根結點外,每個其它結點有且僅有一個直接的父結點;
  3. 除根結點外,每個結點可以有零個或者多個子結點;
  4. 結點之間通過邊連接,形成層級關系,且不存在環路。

當有限集合內的元素數大于1時,除根結點外的其余結點可以分為 m(m>0) 個互不相交的有限集,其中每個有限集合本身又是一棵樹,并且稱為根的子樹。

從遞歸角度來看:

  • 一棵樹要么是空樹(沒有任何節點);
  • 要么由一個根節點和零個或多個子樹組成,而這些子樹本身又是樹。

術語

根節點 :樹的起始節點,沒有父節點。

父節點,子節點 :結點之間的直接上下級關系。

葉節點 :沒有子節點的結點。葉節點的度為0。

分支節點:有子結點的結點稱為分支結點。度大于0。

:一個結點的子節點個數。

層次、深度、高度 :結點的層次從根開始定義,根結點為第1層,它的子結點為第2層,以此類推。結點的深度就是結點所在的層次。樹的高度或深度是樹中結點的最大層數。結點的高度是以該節點為根的子樹的高度。

子樹(subtree) :以某個結點為根結點的樹。

路徑:樹中兩個結點之間的路徑是由這兩個結點之間所經過的結點序列構成的。

路徑長度:是路徑中所經過的邊的數目(即節點數減一)。

說法含義
兩結點間的路徑長度連接兩個結點路徑中的邊數
樹的路徑長度(內部路徑長度)樹中所有結點到根節點路徑長度的總和
樹的直徑(最大路徑長度)樹中兩個結點間最長路徑的邊數

樹的性質

1.樹的結點數n等于所有結點的度數之和加1
令一棵樹的總結點數為n,那么總度數為n?1,不同度數的結點的數量為nm,m為度數下標,那么n=n0+n1+n2+...+nm=∑i=0mni再求每個不同度數的結點的總度數為m?nm,那么n?1=1n1+2n2+3n3+...+mnm=∑i=1mini得到:n=∑i=1mini+1=∑i=0mni 令一棵樹的總結點數為n,那么總度數為n-1,不同度數的結點的數量為n_m,m為度數下標,那么\\ n = n_0 + n_1 + n_2 + ... + n_m = \sum_{i=0}^m n_i \\ 再求每個不同度數的結點的總度數為m*n_m,那么\\ n - 1 = 1n_1 + 2n_2+ 3n_3 + ... + mn_m = \sum_{i=1}^m in_i \\ 得到:n = \sum_{i=1}^m in_i + 1 = \sum_{i=0}^m n_i 令一棵樹的總結點數為n,那么總度數為n?1,不同度數的結點的數量為nm?,m為度數下標,那么n=n0?+n1?+n2?+...+nm?=i=0m?ni?再求每個不同度數的結點的總度數為m?nm?,那么n?1=1n1?+2n2?+3n3?+...+mnm?=i=1m?ini?得到:n=i=1m?ini?+1=i=0m?ni?
由上述推導過程,可以看出,當計算樹的總度數的時候,葉節點(沒有子節點的結點)是沒有貢獻的,因為按照計算公式,葉結點的總度數為0。但是當計算總結點數的時候是有的。所以,可以借助最后推導出的公式來計算葉結點的結點數,計算如下:
由于已知:∑i=1mini+1=∑i=0mni然后對等號右邊部分提取出n0,得到∑i=0mni=n0+∑i=1mni,等效替換回原式得到∑i=1mini+1=n0+∑i=1mni化簡n0=∑i=1mini?∑i=1mni+1=∑i=1m(i?1)ni+1 由于已知:\sum_{i=1}^m in_i + 1 = \sum_{i=0}^m n_i \\ 然后對等號右邊部分提取出n_0,得到\\ \sum_{i=0}^m n_i = n_0 + \sum_{i=1}^m n_i,等效替換回原式得到\\ \sum_{i=1}^m in_i + 1 = n_0 + \sum_{i=1}^m n_i \\ 化簡\\ n_0 = \sum_{i=1}^m in_i - \sum_{i=1}^m n_i + 1 = \sum_{i=1}^m (i-1)n_i + 1 由于已知:i=1m?ini?+1=i=0m?ni?然后對等號右邊部分提取出n0?,得到i=0m?ni?=n0?+i=1m?ni?,等效替換回原式得到i=1m?ini?+1=n0?+i=1m?ni?化簡n0?=i=1m?ini??i=1m?ni?+1=i=1m?(i?1)ni?+1
2.度為 m 的樹中第 i 層上至多有m的(i - 1)次方個結點(i ≥ 1)

已知第一層只有一個結點為根結點;那么第2層至多就有 m 個結點,那么第3層至多就有 m2 個結點,歸納推導出
第i層的結點數≤mi?1,其中(i≥1) 第i層的結點數 ≤ m^{i-1} ,其中(i≥1) i層的結點數mi?1,其中(i1)
3.高度為h的m叉樹至多有 (m^h - 1)/(m - 1) 個結點

如果要讓m叉樹的結點數達到最大,那么除第一層外,每層的結點數都應滿足 n_h = m^(h-1),計算總結點數為
N=1+m1+m2+m3+...+mh?1=(mh?1)/(m?1) N = 1 + m^1 + m^2 + m^3 + ... + m^{h-1} = (m^h-1)/(m-1) N=1+m1+m2+m3+...+mh?1=(mh?1)/(m?1)
4.度為 m,具有 n 個結點的樹的最大高度 h 為 (n - m + 1)

因為已知度為m,那么樹中至少有一個結點的子結點數為m;要為了使樹的高度最大,度為m的結點的子結點位于同一層,其它層則只放置1個結點。

舉例:

  1. 根結點 – 度數為1的子結點 – 度數為1的子結點 – … – 度數為m的子結點
  2. 根結點 – 度數為1的子結點 – 度數為m的子結點 – … – 度數為1的子結點

5.度為 m、具有 n 個結點的樹的最小高度 h 為[ log_m (n * ( m - 1 ) + 1 ) ]

首先已知:要使一棵樹的高度盡量小,那么每層(除第一層和最后一層)的結點數都應滿足性質2。第一層是根結點,最后一層只要有結點就行,不一定要填滿。

再借助性質3可以推導出:
當樹的高度取得最小高度h的時候:總的結點數最多為(mh?1)/(m?1)最少為(mh?1?1)/(m?1)+1。可得到下列不等式:(mh?1?1)/(m?1)<n≤(mh?1)/(m?1) 當樹的高度取得最小高度h的時候:\\總的結點數\\最多為 (m^h - 1)/(m - 1) \\最少為(m^{h-1} - 1)/(m - 1) + 1。\\ 可得到下列不等式: (m^{h-1} - 1)/(m - 1) < n ≤ (m^h - 1)/(m - 1) 當樹的高度取得最小高度h的時候:總的結點數最多為(mh?1)/(m?1)最少為(mh?1?1)/(m?1)+1可得到下列不等式:(mh?1?1)/(m?1)<n(mh?1)/(m?1)
然后要明確,求最小高度的位置應該是結點數最多的位置,防止錯誤的估計高度。因此得到如下臨界狀態
n=(mh?1)/(m?1)hmin是整數,向上取整取最小值,求解得:hmin=?logm(n(m?1)+1)? n = (m^h - 1)/(m - 1)\\ h_{min}是整數,向上取整取最小值,求解得:\\ h_{min} = ?log_m (n(m?1)+1)? n=(mh?1)/(m?1)hmin?是整數,向上取整取最小值,求解得:hmin?=?logm?(n(m?1)+1)?

**森林中有k顆樹,總結點數為n,總邊數為e,那么 k = n - e。或者說森林中結點數不變,邊數減少 1,則森林中的樹的棵數增加 1 **

在一棵中,結點數為 n,邊數必然是 n?1。森林是若干棵樹的集合,因此森林中包含若干棵互不連通的子樹。設森林中結點數為 n,邊數為 e,樹的棵數為 k,則有:樹的棵數 k = n ? e

推導:
每棵樹單獨結點數為ni,對應邊數為ni?1森林中所有樹的結點數和為:∑i=1kni=n森林中所有樹的邊數和為:e=∑i=1k(ni?1)=∑i=1kni?k=n?k所以森林中樹的棵樹k=n?e 每棵樹單獨結點數為 n_i,對應邊數為 n_i?1 \\ 森林中所有樹的結點數和為:\sum_{i=1}^k n_i = n \\ 森林中所有樹的邊數和為:e = \sum_{i=1}^k(n_i - 1) = \sum_{i=1}^kn_i - k = n - k \\ 所以森林中樹的棵樹k = n - e 每棵樹單獨結點數為ni?,對應邊數為ni??1森林中所有樹的結點數和為:i=1k?ni?=n森林中所有樹的邊數和為:e=i=1k?(ni??1)=i=1k?ni??k=n?k所以森林中樹的棵樹k=n?e

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

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

相關文章

PyTorch RNN 名字分類器

PyTorch RNN 名字分類器詳解 使用PyTorch實現的字符級RNN&#xff08;循環神經網絡&#xff09;項目&#xff0c;用于根據人名預測其所屬的語言/國家。該模型通過學習不同語言名字的字符模式&#xff0c;夠識別名字的語言起源。 環境設置 import torch import string import un…

面向對象之類方法,成員變量和局部變量

1.類的方法必須包含幾個部分&#xff1f;2.成員變量和局部變量類的方法必須包含哪幾個部分&#xff1f;.方法名&#xff1a;用于標識方法的名稱&#xff0c;遵循標識符命名規則&#xff0c;通常采用駝峰命名法。返回值類型&#xff1a;指定方法返回的數據類型。如果方法不返回任…

古法筆記 | 通過查表進行ASCII字符編碼轉換

ASCII字符集是比較早期的一種字符編碼&#xff0c;只能表示英文字符&#xff0c;最多能表示128個字符。 字符集規定了每個字符和二進制數之間的對應關系&#xff0c;可以通過查表完成二進制數到字符的轉換ASCII字符占用的存儲空間是定長的1字節 ASCII字符的官方碼點表見下圖&…

Linux C實現單生產者多消費者環形緩沖區

使用C11里的原子變量實現&#xff0c;沒有用互斥鎖&#xff0c;效率更高。ring_buffer.h:/*** file ring_buffer.h* author tl* brief 單生產者多消費者環形緩沖區&#xff0c;每條數據被所有消費者讀后才釋放。讀線程安全&#xff0c;寫僅單線程。* version* date 2025-08-06*…

復雜場景識別率↑31%!陌訊多模態融合算法在智慧環衛的實戰解析

摘要&#xff1a;針對邊緣計算優化的垃圾堆放識別場景&#xff0c;本文解析了基于動態決策機制的視覺算法如何提升復雜環境的魯棒性。實測數據顯示在遮擋/光照干擾下&#xff0c;mAP0.5較基線提升28.3%&#xff0c;誤報率降低至行業1/5水平。一、行業痛點&#xff1a;智慧環衛的…

MyBatis-Plus Service 接口:如何在 MyBatis-Plus 中實現業務邏輯層??

全文目錄&#xff1a;開篇語前言1. MyBatis-Plus 的 IService 接口1.1 基本使用示例&#xff1a;創建實體類 User 和 UserService1.2 創建 IService 接口1.3 創建 ServiceImpl 類1.4 典型的數據庫操作方法1.4.1 save()&#xff1a;保存數據1.4.2 remove()&#xff1a;刪除數據1…

[激光原理與應用-168]:光源 - 常見光源的分類、特性及應用場景的詳細解析,涵蓋技術原理、優缺點及典型應用領域

一、半導體光源1. LED光源&#xff08;發光二極管&#xff09;原理&#xff1a;通過半導體PN結的電子-空穴復合發光&#xff0c;波長由材料帶隙決定&#xff08;如GaN發藍光、AlGaInP發紅光&#xff09;。特性&#xff1a;優點&#xff1a;壽命長&#xff08;>5萬小時&#…

Metronic v.7.1.7企業級Web應用前端框架全攻略

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;Metronic是一款專注于構建響應式、高性能企業級Web應用的前端開發框架。最新版本v.7.1.7引入了多種功能和優化&#xff0c;以增強開發效率和用戶體驗。詳細介紹了其核心特性&#xff0c;包括響應式設計、多種模…

鴻蒙開發--Notification Kit(用戶通知服務)

通知是手機系統中很重要的信息展示方式&#xff0c;通知不僅可以展示文字&#xff0c;也可以展示圖片&#xff0c;甚至可以將組件加到通知中&#xff0c;只要用戶不清空&#xff0c;通知的信息可以永久保留在狀態欄上通知的介紹 通知 Notification通知&#xff0c;即在一個應用…

鴻蒙 - 分享功能

文章目錄一、背景二、app發起分享1. 通過分享面板進行分享2. 使用其他應用打開二、處理分享的內容1. module.json5 配置可接收分享2. 解析分享的數據一、背景 在App開發中&#xff0c;分享是常用功能&#xff0c;這里介紹鴻蒙開發中&#xff0c;其他應用分享到自己的app中&…

【Agent 系統設計】基于大語言模型的智能Agent系統

一篇阿里博文引發的思考和探索。基于大語言模型的智能Agent系統 1. 系統核心思想 核心思想是構建一個以大語言模型&#xff08;LLM&#xff09;為“大腦”的智能代理&#xff08;Agent&#xff09;&#xff0c;旨在解決將人類的自然語言指令高效、準確地轉化為機器可執行的自動…

企業級Web框架性能對決:Spring Boot、Django、Node.js與ASP.NET深度測評

企業級Web應用的開發效率與運行性能直接關系到業務的成敗。本文通過構建標準化的待辦事項&#xff08;Todo&#xff09;應用&#xff0c;對四大主流框架——Spring Boot、Django、Node.js和ASP.NET展開全面的性能較量。我們將從底層架構特性出發&#xff0c;結合實測數據與數據…

為什么 `source ~/.bashrc` 在 systemd 或 crontab 中不生效

摘要&#xff1a;你是否遇到過這樣的問題&#xff1a;在終端里運行腳本能正常工作&#xff0c;但用 systemd 或 crontab 自動啟動時卻報錯“命令找不到”、“模塊導入失敗”&#xff1f; 本文將揭示一個深藏在 ~/.bashrc 中的“陷阱”&#xff1a;非交互式 shell 會直接退出&am…

Linux 磁盤中的文件

1.磁盤結構 Linux中的文件加載到內存上之前是放到哪的&#xff1f; 放在磁盤上的文件——>訪問文件&#xff0c;打開它——>找到這個文件——>路徑 但文件是怎樣存儲在磁盤上的 1.1物理結構磁盤可以理解為上百億個小磁鐵&#xff08;如N為1&#xff0c;S為0&#xff0…

【方法】Git本地倉庫的文件夾不顯示紅色感嘆號、綠色對號等圖標

文章目錄前言開始操作winr&#xff0c;輸入regedit&#xff0c;打開注冊表重啟資源管理器前言 這個綠色對號圖標表示本地倉庫和遠程的GitHub倉庫內容保持一致&#xff0c;紅色則是相反咯&#xff0c;給你們瞅一下。 首先這兩個東西你一定要安裝配置好了&#xff0c;安裝順序不…

量化交易與主觀交易:哪種方式更勝一籌?

文章概要 在投資的世界里&#xff0c;量化交易和主觀交易如同冰與火&#xff0c;各自擁有獨特的優勢與挑戰。作為一名投資者&#xff0c;了解這兩種交易方式的差異和各自的優缺點至關重要。本文將從決策依據、執行方式、風險管理等方面深入探討量化交易的精確性與主觀交易的靈活…

【JS】扁平樹數據轉為樹結構

扁平數據轉為最終效果[{"label":"疼遜有限公司","code":"1212","disabled":false,"parentId":"none","children":[{"label":"財務部","code":"34343&quo…

數據結構4-棧、隊列

摘要&#xff1a;本文系統介紹了棧和隊列兩種基礎數據結構。棧采用"先進后出"原則&#xff0c;分為順序棧和鏈式棧&#xff0c;詳細說明了壓棧、出棧等基本操作及其實現方法。隊列遵循"先進先出"規則&#xff0c;同樣分為順序隊列和鏈式隊列&#xff0c;重…

大數據spark、hasdoop 深度學習、機器學習算法的音樂平臺用戶情感分析系統設計與實現

大數據spark、hasdoop 深度學習、機器學習算法的音樂平臺用戶情感分析系統設計與實現

視頻匯聚系統EasyCVR調用設備錄像保活時視頻流不連貫問題解決方案

在使用EasyCVR過程中&#xff0c;有用戶反饋調用設備錄像保活功能時&#xff0c;出現視頻流不連貫的情況。針對這一問題&#xff0c;我們經過排查與測試&#xff0c;整理出如下解決步驟&#xff0c;供開發者參考&#xff1a;具體解決步驟1&#xff09;先調用登錄接口完成鑒權確…