1.樹定義算法
專業定義:數據庫
1.有且只有一個稱爲根的結點數組
2.有若干個互不相關的子樹,這些子樹自己也是一棵樹性能
通俗定義操作系統
1.樹是由結點和邊組成3d
2.每個結點只有一個父節點,但能夠有多個子節點指針
3.但有一個結點例外,該節點沒有父節點,此結點稱爲根結點對象
專業術語blog
結點 父節點 子節點 子孫 堂兄弟繼承
深度:
從根結點到最底層結點的層數稱之爲深度
根結點是第一層
葉子結點:
沒有子結點的結點
非終端結點:
實際就是非葉子結點
度:
子結點的個數稱爲度
2.樹分類
通常樹
任意一個結點的子結點的個數都不受限制
二叉樹
任意一個結點的子結點個數最多兩個,且子結點的位置不可更改(序號)
分類:
通常二叉樹
滿二叉樹
在不增長樹的層數的前提下,沒法添加一個結點的二叉樹就是滿二叉樹
一個結點的二叉樹就是滿二叉樹
徹底二叉樹(必須是滿的而後再砍)
若是隻是刪除了滿二叉樹最底層最右邊的連續若干個結點
這樣造成的二叉樹就是徹底二叉樹
(滿二叉樹是徹底二叉樹的特例,就是一個不刪)
森林
n個互不相交的樹的集合
紅的是通常二叉樹
藍的是補充爲 滿二叉樹
黃色的是砍除部分,稱爲徹底二叉樹
3.樹的存儲
(1)二叉樹的存儲
連續存儲【徹底二叉樹】(根據序號和算法等)
優勢:
查找某個結點的父結點和子結點(也包括判斷有沒有子節點)速度很快
缺點:
耗用內存空間過大
鏈式存儲(根據指針域指向來存儲)
(2)通常樹的存儲
雙親表示法
求父節點方便
(經過結構體數組或類來存儲子節點數據以及父節點的下標)
孩子表示法
求子節點方便
(經過鏈表來存儲子節點)
雙親孩子表示法
求父節點和子節點都很方便
(結合前兩種,操做比較複雜)
二叉樹表示法
把一個普通樹轉化成二叉樹來存儲
具體轉換方法:
設法保證任意一個結點的
左指針域指向第一個孩子
右指針域指向它的兄弟
只要知足就能夠把一個普通樹轉化成二叉樹
一個普通樹轉化成二叉樹必定沒有右子樹
(3)森林的存儲
相似於通常樹的二叉樹表示法
4.二叉樹操做
遍歷
先序遍歷【先訪問根結點】
先訪問根結點
再先序訪問左子樹
再先序訪問右子樹
中序遍歷【中間訪問根結點】
中序遍歷左子樹
再訪問根結點
再中序遍歷右子樹
後序遍歷【最後訪問根結點】
中序遍歷左子樹
中序遍歷右子樹
再訪問根結點
已知兩種遍歷序列求原始二叉樹
經過先序和中序,或者中序和後序能夠還原出原始二叉樹
可是經過先序和後序沒法還原出原始的二叉樹
先序和中序:經過先序第一個來判斷根結點,以後找到中序的那個根結點後,截斷左
邊,再找先序中根結點後下一個字母,截斷該字母左和右
中序和後序:經過後序第一個來判斷根結點,操做與先序只是從後開始的區別
5.應用
樹是數據庫中數據組織的一種重要形式
操做系統子父系統的關係自己就是一棵樹
面嚮對象語言中類的繼承關係
赫夫曼樹
(1)術語
結點的路徑長度:從根結點到該結點的路徑上的鏈接數
樹的路徑長度:樹中每一個葉子結點的路徑長度之和
結點帶權路徑長度:結點的路徑長度與結點權值的累加
樹的帶權路徑長度:WPL 樹的全部葉子結點的帶權路徑長度之和
(2)舉例
左邊 右邊
結點的路徑長度: A:1 B:2 C:3 D:3 A:3 B:3 C:2 D:1
樹的路徑長度: 1+2+3+3=9 1+2+3+3=9
結點帶權路徑長度:A:1*5=5 B:2*15=30 C:3*70=210 D:3*10=30 A:15 B:45 C:140 D:10
樹的帶權路徑長度:275 210
左邊的WLP大於右邊,因此右邊效率更好(WLP越小二叉樹性能越高效)