樹是一種非常重要的數據結構,它是非線性結構,它不是Python內置的數據結構;
樹:
1.非線性結構,每個元素可以有多個前驅和後繼;
2.樹是n(n>=0)個元素的集合
n=0時,稱爲空樹;
樹只有一個特殊的沒有前驅的元素,稱爲樹的根Root;
樹中除了根結點外,其餘元素只能有一個前驅,可以有零個或多個後繼;
3.遞歸定義
樹T是n(n>=0)個元素的集合。n=0時,稱爲空樹。
有且只有一個特殊元素根,剩餘元素都可以劃分爲m個不相交的集合T1、T2、T3...Tm,
而每一個集合都是樹,稱爲T的子樹Subtree.
子樹也有自己的根。
樹的概念
結點: 樹中的數據元素
結點的度degree: 結點擁有的子樹的數目稱爲度,記作d(v)
葉子結點: 結點的度爲0,稱爲葉子結點leaf、終端結點、末端結點
分支結點: 結點的度不爲0,稱爲非終端結點或分支結點
分支: 結點之間的關係
內部結點: 除根結點外的分支結點,當然也不包括葉子結點
樹的度是樹內各結點的度的最大值。D結點最大爲3.樹的度數就是3.
孩子(兒子Child)結點: 結點的子樹的根結點成爲該結點的孩子
雙親(父Parent)結點: 一個結點是它各子樹的根結點的雙親
兄弟(Sibling)結點: 具有相同雙親結點的結點
祖先結點: 從根結點到該結點所經分支上所有的結點。A、B、D都是G的祖先的結點
子孫結點: 結點的所有子樹上的結點都稱爲該結點的子孫。B的子孫是D、G、H、I
結點的層次(Level): 根結點爲第一層,根的孩子爲第二層,以此類推,記作L(v)
樹的深度(高度Depth): 樹的層次的最大值。上圖的樹深度爲4
堂兄弟: 雙親在同一層的結點
有序樹: 結點的子樹是有順序的(兄弟有大小,有先後次序),不能交換
無序樹: 結點的子樹是有無序的,可以交換
路徑: 樹中的k個結點n1、n2、...、nk,滿足ni是n(i+1)的雙親,成爲n1到nk的一條路徑。就是一條線串下來的,
前一個都是後一個的父(前驅)結點。
路徑長度 = 路徑上結點數-1,也是分支數
森林:m(m>=0)棵不相交的樹的集合
對於結點而言,其子樹的集合就是森林。A結點的2棵子樹的集合就是森林。
樹的特點:
唯一的根
子樹不相交
除了根以外,每個元素只能有一個前驅,可以有零個或多個後繼
根結點沒有雙親結點(前驅),葉子結點沒有孩子結點(後繼)
vi是vj的雙親,則L(vi) = L(vj)-1,也就是說雙親比孩子結點的層次上1
二叉樹
每個結點最多2棵子樹
二叉樹不存在度數大於2的結點
它是有序樹,左子樹、右子樹是順序的,不能交換次序
即使某個結點只有一棵子樹,也要確定它是左子樹還是右子樹
二叉樹的五種基本形態
空二叉樹
只有一個根結點
根結點只有左子樹
根結點只有右子樹
根結點有左子樹和右子樹
斜樹:
左斜樹,所有結點都只有左子樹;
右斜樹,所有結點都只有右子樹;
滿二叉樹:
一棵二叉樹的所有分支結點都存在左子樹和右子樹,並且所有葉子結點只存在在最下面一層。
同樣深度二叉樹中,滿二叉樹結點最多。
k爲深度(1<=k<=n),則結點總數爲2^k-1
如下圖,一個深度爲4的15個結點的滿二叉樹
完全二叉樹Complete Binary Tree
若二叉樹的深度爲k,二叉樹的層數從1到k-1層的結點數都達到了最大個數,在第k層的所有結點都集中在最左邊,
這就是完全二叉樹;
完全二叉樹由滿二叉樹引出;
滿二叉樹一定是完全二叉樹,但完全二叉樹不是滿二叉樹;
k爲深度(1<=k<=n),則結點總數最大值爲2^k-1,當達到最大值的時候就是滿二叉樹;
二叉樹的性質
性質1:
在二叉樹的第i層上至多有2^(i-1)個結點(i>=1)
性質2:
深度爲k的二叉樹,至多有2^k-1個結點(k>=1)