樹和二叉樹

樹和二叉樹

什麼是樹結構

樹形結構是一類重要的非線性結構,樹形結構中結點之間具備分支,並具備層次結構關係,相似於天然界中的樹; 生活中也大量存在,如家譜,行政組織結構均可以用樹形象的表示;算法

既然天然界中存在這種結構的數據,那計算機中也須要相應的數據結構來存儲; 在計算機領域樹結構也有着普遍的應用,如編譯程序中使用樹表示語法結構,數據庫中用樹(索引)來組織數據,分析算法行爲時可用樹描述其指向過程;數據庫

樹的定義

樹是n (n>=0)個結點的有限集,記作T;當結點數n爲0時稱爲空樹數據結構

且知足如下特性:

當結點數n大於0時,有且僅有一個特定的根結點;spa

除根結點外的其他結點可分爲m(m>=0)個互不相交的子集,T1.T2....Tn,其中每一個子集Ti又是一棵樹,稱之爲子樹3d

任意一棵樹的結點數=分支數+1code

樹的邏輯表示

常見的表示法有以下四種:blog

  1. 通常表示法索引

    image-20200516012158755
  2. 文氏圖法it

    image-20200516012910599
  3. 凹入表示法編譯

image-20200516012931802
  1. 嵌套括號法:

    (根(子樹,子樹,子樹))
    (A(B(E,F),C,D(G)))

其中第1,4兩種最爲常見;

樹的相關術語

  • 結點

    • 由一個數據元素及若干個指向其餘結點的分支組成
    • 結點的度: 該結點的子樹數(分支數==子結點數)
    • 樹的度: 樹中全部結點的度的最大值
  • 葉子結點(終端結點)

    • 度爲0的結點(沒有孩子)
  • 分支結點(非終端結點)

    • 度不爲0的結點(有孩子)
  • 孩子(子結點)

    • 結點的子樹的根結點,稱爲該結點的孩子
  • 雙親(父結點)

    • 一個結點是該結點全部子結點的雙親
  • 祖先

    • 結點的祖先是指從根結點到該結點的一條路徑上的全部結點
  • 子孫

    • 從某結點到葉結點的路徑上全部結點(包括葉結點),稱爲該結點的子孫
  • 兄弟

    • 具備相同父結點的結點
  • 結點的層次(計算方式)

    • 從根算起,根爲第一層,根結點的全部孩子都在第二層; L層的全部結點的孩子都在L+1層;
  • 堂兄弟

    • 其雙親不一樣但處於同一層的結點
  • 樹的深度(高度)

    • 樹中結點的最大層次;
  • 有序/無序樹

    • 樹中各個節點的子樹從左到右是有次序的(升序/降序),不能互換,稱爲有序樹
    • 樹中各個節點的子樹從是無次序的能夠互換,稱爲無序樹
  • 森林

    • 是m(m>=0)棵樹的集合

樹的基本運算

  1. 求根Root(T):求樹T的根結點;
  2. 求雙親Parent(T,X):求結點X在樹T上的雙親; 若X是樹T的根或X不在T上,則結果爲一特殊 標誌(NULL);
  3. 求孩子Child(T,X,i):求樹T上結點X的第i個孩子 結點;若X不在T上或X沒有第i個孩子,則結 果爲一特殊標誌(NULL);
  4. 建樹Create(X,T1,...,Tk),k>1:創建一棵以X爲根, 以T1,...,Tk爲第1,...,k棵子樹的樹;
  5. 剪枝Delete(T,X,i):刪除樹T上結點X的第i棵子 樹;若T無第i棵子樹,則爲空操做;
  6. 遍歷TraverseTree(T):遍歷樹,即訪問樹中每一個 結點,且每一個結點僅被訪問一次。

二叉樹

二叉樹是樹的一種特殊情形,二叉樹在樹結構的應用中起着很是重要的做用,由於二叉樹有許多良好的性質和簡單的物理表示,且任何樹均可以與二叉樹相互轉換,這極大下降了樹的存儲結構及其運算複雜度;

二叉樹的定義

二叉樹是由n(n>=0)個節點組成的有限集合,當結點數n爲0時稱爲空二叉樹,當結點數n>0時,每一個節點最多有兩個子樹,稱爲左子樹和右子樹

特色

  • 每一個節點最多隻能有兩個子樹

  • 子樹有左右之分,且次序不能顛倒

  • 即便只有一個子樹也必須明確左右,這是與樹最主要的差異

  • 二叉樹與樹的對比:

    image-20200516024647705

五種基本形態

a. 空二叉樹

b. 左右子樹均爲空的二叉樹

c. 右子樹爲空的二叉樹

d. 左子樹爲空的二叉樹

b. 左右子樹都非空的二叉樹

二叉樹的性質(*)

二叉樹之因此重要,因其具有如下5個重要特性

1.在二叉樹的第i(i>=1)層上最多有2^(i-1)個結點

根據該性質可經過層數計算該層結點數量

2.深度爲k(k>=1)的二叉樹中最多有(2^k)-1

根據該性質可經過深度計算總節點數

3.任意一顆二叉樹,若是其葉子結點數爲n0,度爲2的節點數爲n2,則n0 = n2 + 1

​ 證實:

​ 度爲0的結點記爲n0,度爲1的結點記爲n1,度爲2的結點記爲n2

​ 設總結點數爲1,即只有根節點,此時知足n0 = n2+1;

​ 如有總結點數爲n的二叉樹,設n = k時知足n0 = n2+1;

​ 當總節點數n=k+1,即增長一個新節點,設爲s,

​ 若新節點s的的父節點爲葉子結點(無子節點),則增長後葉子數n0不變,n2也不變,此時仍知足n0 = n2+1

​ 若新節點s的的父節點爲有一個孩子的結點,則增長後葉子數n0 = n0+1,n2=n2+1,此時仍知足n0 = n2+1,

​ 故n=任意值均知足n0 = n2+1

4.具備n個節點的徹底二叉樹的深度爲floor(log2n)+1

意爲:以2爲底n的對數向下取整後+1

根據該性質對於徹底二叉樹,可經過結點數求樹的深度

5.若對有n個節點的徹底二叉樹的結點從1開始按層編號(從1層到最後一層,每層從左到右)則樹中任意節點i(1<=i<=n)具備如下特性:

  • 若i = 1,則結點i是二叉樹的根,無雙親節點
  • 若i > 1,則i結點的雙親Parent是編號爲floor(i/2)的節點
  • 若是2*i<=n,結點i的左孩子節點編號爲2 * i,不然結點i無左孩子節點,且i爲葉子節點
  • 若是2*i+1<=n,結點i的右孩子節點編號爲2 * i + 1,不然結點i無右孩子節點

根據該性質,可方便的判斷節點是不是根節點,求父節點,求左/右子節點,判斷是否爲葉子結點

二叉樹的分類

  • 滿二叉樹

    深度爲k(k>=1),且有(2^k)-1個結點的二叉樹.

    image-20200516033532788

    即:葉子結點的上一層中全部結點的度均爲2的二叉樹爲滿二叉樹,

  • 徹底二叉樹

    深度爲K的二叉樹中,K-1層是滿的,且K層結點是左連續的(結點編號是連續的),如圖:

    image-20200516034143371

    即:倒數第二層是滿的,且最後一層結點是連續的;

    滿二叉樹是徹底二叉樹的特殊情形

二叉樹的基本運算

  1. 初始化Initial(BT):創建一顆空二叉樹

  2. 求雙親Parent(BT,X):求二叉樹BT上節點X的雙親節點,若X爲BT的根或X不在BT上,結果爲NULL;

  3. 求左孩子LChild(BT,X),右孩子RChild(BT,X):求二叉樹BT上結點X的左/右孩子; 若X爲葉子節點或X不在BT上,結果爲NULL;

  4. 建二叉樹Create(BT):創建一棵二叉樹BT

  5. 遍歷

    每一個節點被訪問一次,且每一個節點僅訪問一次,有四種不一樣的遍歷方式

    • 先序遍歷(根左右)
    • 中序遍歷(左根右)
    • 後續遍歷(左右根)
    • 層次遍歷(按層次)
相關文章
相關標籤/搜索