主頁 >  其他 > 樹的基本概念和性質總結

樹的基本概念和性質總結

2020-09-15 09:35:19 其他

「樹」是一類重要的非線性資料結構,本文介紹了樹的基本概念、術語、性質,

一、樹的基本概念和術語

樹在生活中隨處可見

生活中的樹
樹有許多特點:有一個樹根、樹根可以分出樹干,樹干可以分出許多樹枝、樹枝上有許多葉子,

樹作為一種資料結構,也有相似的特點

樹—一種資料結構

  1. 樹是一個有限集合

  2. 有且僅有一個特定的「根節點」(Root),如上圖中的結點A

  3. 一顆樹的根可以有許多「子樹」,如根節點A有3顆子樹(T1、T2、T3),這些子樹本身也是一棵樹,比如結點B又是樹T1的根節點,

  4. 樹的結點包含「資料元素」和「若干指向其子樹的分支」

  5. 結點的度(Degree):結點擁有的子樹數,如結點A的度為3,結點C的度為1,結點G的度為0

  6. 葉子(Leaf)或 終端結點:度為0的結點,如K

  7. 非終端結點 或 分支節點:度不為0的結點,如結點A、E、C,

  8. 內部結點:除根結點之外的分支節點,即在樹內部的結點,如結點B、C、E、H,

  9. 孩子、雙親、兄弟、堂兄弟、祖先、子孫這些概念和族譜上的相同,

    如:A的孩子是B、C、D,A是B、C、D的雙親,B、C、D是兄弟(同一雙親),F、G、H是堂兄弟(同一層但不同雙親),K的祖先是E、B、A,B的子孫是B、E、F、K、L,

  10. 層次:層次從根開始,根為第一層,根的孩子為第二層……

  11. 深度(Depth)或 高度:樹中結點的最大層次,如樹T的深度為4,

  12. 森林:即n(n≥0)顆互不相交的樹的集合

由上述特點我們可以看出,樹的結構是遞回的,樹T是一顆樹、其根結點A的子樹也是一棵樹、A的子樹的根節點的子樹也是一棵樹、A的子樹的根節點的子樹的根節點的子樹也是一棵樹……

二、二叉樹

1. 二叉樹的基本結構

二叉樹是一種特殊的樹,特點是每個結點至多只有兩顆子樹,所以二叉樹中不存在度大于2的結點,二叉樹的子樹有左右之分,次序不能任意顛倒,

在這里插入圖片描述

二叉樹的5種基本形態:

  1. 空二叉樹
  2. 僅有根結點的二叉樹
  3. 右子樹為空的二叉樹
  4. 左子樹為空的二叉樹
  5. 左右子樹都不為空的二叉樹

二叉樹的結構是遞回的,一個二叉樹或者為空,或者由一個根結點加上兩顆左右子樹構成的(這兩顆子樹也是二叉樹),

滿二叉樹和完全二叉樹是兩種特殊的二叉樹,

滿二叉樹的特點在于「滿」,即每層的結點數都是最大結點數,如下圖:
滿二叉樹

完全二叉樹的「完全」是相對于滿二叉樹來說的,下圖是一個完全二叉樹:

完全二叉樹
對一顆滿二叉樹和一顆完全二叉樹按「自上向下,自左向右」的順序進行編號,如上面兩個圖,完全二叉樹中的所有結點(1~12結點)必須和滿二叉樹中的1~12結點在位置上一一對應

如下左圖為滿二叉樹,右圖為非完全二叉樹,因為其所有結點(1~6結點)和其對應的滿二叉樹中的1~6結點在位置上并不一一對應,

非完全二叉樹

2. 二叉樹的遍歷

搞清了二叉樹的結構,那么如何遍歷它?

二叉樹的結構是遞回的,由根節點、左子樹、右子樹組成,所以我們只需遞回地遍歷這三個部分即可,根據遍歷這三個部分的順序的不同,有三種遍歷方式:

  • 先序遍歷
  • 中(根)序遍歷
  • 后(根)序遍歷

(1) 先序遍歷

基本步驟:

  1. 二叉樹不為空時,

    1. 訪問根結點
    2. 先序遍歷左子樹
    3. 先序遍歷右子樹
  2. 二叉樹為空時,做空操作,

二叉樹先序遍歷程序

步驟描述:

  1. 訪問根結點A
  2. A有左孩子B,B是A的左子樹的根結點,訪問結點B
  3. B有左孩子D,D是B的左子樹的根結點,訪問根結點D
  4. D沒有左孩子
  5. D沒有右孩子
  6. 回傳到B
  7. B有右孩子E,E是B的右子樹的根結點,訪問根結點E
  8. E有左孩子G,G是E的左子樹的根結點,訪問根結點G
  9. G沒有左孩子
  10. G沒有右孩子
  11. 回傳到E
  12. E沒有右孩子
  13. 回傳到A
  14. A有右孩子C,C是A的右子樹的根結點,訪問根結點C
  15. C沒有左孩子
  16. C有右孩子F,F是C的右子樹的根結點,訪問根結點F
  17. F有左孩子H,H是F的左子樹的根結點,訪問根結點H
  18. H沒有左孩子
  19. H有右孩子I,I是H的右子樹的根結點,訪問根結點I
  20. I沒有左子樹
  21. I沒有右子樹
  22. 回傳到F
  23. F沒有右子樹
  24. 遍歷結束

所以與其說是在遍歷結點,不如說是在遍歷「根結點」,我們只是在遞回地把「所有根結點」找出來并輸出而已,(因為每個結點都可以看做是根結點)

(2) 中序遍歷

基本步驟:

  1. 二叉樹不為空時,

    1. 中序遍歷左子樹
    2. 訪問根結點
    3. 中序遍歷右子樹
  2. 二叉樹為空時,做空操作,

二叉樹中序遍歷程序

(3) 后序遍歷

基本步驟:

  1. 二叉樹不為空時,

    1. 后序遍歷左子樹
    2. 后序遍歷右子樹
    3. 訪問根結點
  2. 二叉樹為空時,做空操作,

二叉樹后序遍歷程序

3. 二叉樹、樹、森林

(1) 樹的遍歷

先根遍歷:先訪問樹的根結點,然后依次先根遍歷根的每顆子樹
樹的先根遍歷程序

后根遍歷:先依次后根遍歷每顆子樹,然后訪問根結點
樹的后根遍歷程序

(2) 森林的遍歷

先序遍歷

若森林非空,則:

  1. 訪問森立中第一棵樹的根結點
  2. 先序遍歷第一棵樹的「根結點的子樹構成的森林」
  3. 先序遍歷除去第一棵樹之后「剩余的樹構成的森林」

說白了就是,依次先根遍歷森林中的每棵樹

森林的先序遍歷程序

中序遍歷:

若森林非空,則:

  1. 中序遍歷森林中第一棵樹的「根結點的子樹構成的森林」
  2. 訪問第一棵樹的根結點
  3. 中序遍歷除去第一棵樹之后「剩余的樹構成的森林」

說白了就是,依次后根遍歷森林中的每顆樹

森林的中序遍歷程序

森林的先序遍歷和中序遍歷即為其對應二叉樹的先序和中序遍歷,

(3) 二叉樹、樹、森林的轉換

樹和二叉樹的轉換:

給定一棵樹,可以找到惟一的一顆二叉樹與之對應,
樹轉換為二叉樹
轉換方法:

  1. 按照「先根遍歷的次序」來轉化每個結點
  2. 如果該結點是根結點,則作為二叉樹的根結點
  3. 如果該結點是「第一個孩子」,則作為「上一個結點的左孩子」
  4. 如果該結點「非第一個孩子」,則作為「上一個兄弟結點的右孩子」

說明:

  1. 孩子的次序通常自左向右排序,如A的孩子BCD的次序為第一個、第二個、第三個
  2. 「上一個結點」是指在先根遍歷次序中的上一個結點,
  3. 「上一個兄弟結點」是指在原樹中的左面的兄弟結點,如E、F、G為兄弟,F的上一個兄弟結點為E,G的兄弟結點為F,

觀察樹對應的二叉樹,我們發現:

  1. 「在二叉樹中,某個結點的左孩子」對應「在原樹中,該結點的第一個孩子」,
  2. 「在二叉樹中,某個結點的右孩子」對應「在原樹中,該結點的兄弟節點」,

根據以上兩個特點,我們可以將二叉樹轉化為樹,

森林和二叉樹的轉換:

「森林和二叉樹的轉換」與「樹和二叉樹的轉換」規則類似,我們只需將森林中的每棵樹的根結點看做是兄弟結點,即將森林看做一棵樹,然后按照樹和二叉樹的轉換規則即可,

森林轉化為二叉樹

三、Huffman樹

帶權的二叉樹

  1. 路徑:從樹中一個結點到另一個結點之間的分支構成這兩個結點之間的路徑

  2. 路徑長度:路徑上的分支數目,

    如結點d的路徑長度為2

  3. 樹的路徑長度:從樹根到每一個結點的路徑長度之和,

    上圖中樹的路徑長度為0+1+1+2+2+3+3=12

  4. 結點的帶權路徑長度:從該結點到樹根之間的路徑長度與結點上的權的乘積,

    結點d的帶權路徑長度為2×4=8

  5. 樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和,

    上圖樹的帶權路徑長度為2×4+3×7+3×5+1×2=46

1. 最優二叉樹

樹的帶權路徑長度最小的二叉樹為最優二叉樹或Huffman(赫夫曼)樹,

上圖中的二叉樹并不是最優二叉樹,那么我們如何構造最優二叉樹?

  1. 給定一個集合,該集合中有n顆二叉樹,每顆二叉樹都只有一個帶權的根結點,其左右子樹為空
  2. 選取兩顆根結點的權值最小的樹作為左右子樹構造一顆新的二叉樹,新二叉樹的根結點的權值為其左右子樹上根結點的權值之和
  3. 在集合中洗掉這兩棵樹,同時將新構造的二叉樹加入集合中
  4. 重復步驟2、3,直到集合中只含一棵樹為止,該樹便是赫夫曼樹,

構造赫夫曼樹的程序

2. Huffman編碼

如果將電文中的字符A、B、C、D分別編碼為0、00、1、01,當發送方發送000011010時,接收方并不能準確翻譯,因為0000可能翻譯為AAAA或BB或AAB或BAA,

所以如果要設計長短不一的編碼,必須滿足任一個字符的編碼都不是另一個字符的編碼的前綴,這種編碼叫做前綴編碼,

我們可以利用二叉樹來設計前綴編碼:

前綴編碼

4個葉子結點表示ABCD,約定左分支表示0,右分支表示1,從根節點到葉子結點的路徑上分支組成該葉子結點字符的編碼,A:0,B:10,C:110,D:1111,按這種方式得到的編碼編譯的電文并一定不是最短的,

如何得到使電文總長最短的二進制前綴編碼呢?

將字符出現的頻率作為權,設計一顆赫夫曼樹,由該赫夫曼樹得到的前綴編碼編譯的電文是最短的,這種編碼稱為赫夫曼編碼,

如有錯誤,還請指正


文章首發于公眾號『行人觀學』

在這里插入圖片描述


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/45352.html

標籤:其他

上一篇:劍指Offer(第二版)面試題目分析與實作-解決面試題的思路

下一篇:NTP時鐘服務器在標準化考場系統應用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more