1. 程式人生 > >資料結構與演算法-樹

資料結構與演算法-樹

樹的抽象資料型別定義

若|D|=0,則稱為空樹;
否則:
(1) 在D中存在唯一的稱為根的資料元素root,
(2) 當n>1時,其餘結點可分為m (m>0)個互不相交的有限集T1, T2, …, Tm,其中Ti本身是一棵符合本定義的樹,稱為根root的子樹。
例如:A是根;其餘結點分成三個互不相交的子集,T1={B,E,F,K,L}; T2={C,G};T3={D,H,I,J,M};T1,T2,T3都是根A的子樹,且本身也是一棵樹。

樹的表示方法

在這裡插入圖片描述

  • 凹入表示法
    在這裡插入圖片描述

  • 巢狀集合表示法
    在這裡插入圖片描述

  • 廣義表
    在這裡插入圖片描述

樹的基本術語

  • 結點:資料元素+若干指向子樹的分支
  • 結點的度:分支的個數
  • 樹的度:樹中所有結點的度的最大值
  • 葉子節點:度為零的結點
  • 分支(非終端)結點:度大於零的結點
  • (從根到結點的)路徑:由從根到該結點所經分支和結點構成
  • 祖先結點、雙親結點、兄弟結點、堂兄弟節點、孩子結點、子孫結點:
  • 結點的層次:假設根結點的層次為0(或者為1),第 i 層結點的子樹的根結點的層次為 i(或者為i-1)
  • 樹的深度:樹中葉子結點所在的最大層次
    在這裡插入圖片描述
  • 有向樹:(1) 有確定的根;(2) 樹根和子樹根之間為有向關係
  • 有序樹:子樹之間存在確定的次序關係
  • 無序樹:子樹之間不存在確定的次序關係
  • 森林:是 m(m≥0)棵互不相交的樹的集合
  • 任何一棵非空樹是一個二元組 Tree = (root,F)其中:root 被稱為根結點,F 被稱為子樹森林

在這裡插入圖片描述

樹的結構特點

線性結構 樹型結構
第一個資料元素無前驅 根結點(無前驅)
最後一個數據元素(無後繼) 多個葉子結點(無後繼)
其它資料元素(一個前驅、一個後繼) 其它資料元素(一個前驅、多個後繼)

樹的儲存結構

雙親標示法

用一組連續空間儲存樹的結點,同時在每個結點中附設一個指示器指示其雙親結點在連結串列中的位置。
在這裡插入圖片描述

孩子連結串列表示法

每個結點的孩子結點用單鏈表儲存,再用含n個元素的結構陣列指向每個孩子連結串列。
在這裡插入圖片描述

帶雙親的孩子連結串列表示法

  1. 雙親表示法,PARENT(T,x)可以在常量時間內完成,但是求結點的孩子時需要遍歷整個結構。
  2. 孩子連結串列表示法,適於那些涉及孩子的操作,卻不適於PARENT(T,x)操作。
  3. 將雙親表示法和孩子連結串列表示法合在一起,可以發揮以上兩種儲存結構的優勢,稱為帶雙親的孩子連結串列表示法
    在這裡插入圖片描述

孩子兄弟儲存表示法

樹的孩子兄弟儲存表示法,又稱為二叉樹表示法,以二叉連結串列作為樹的儲存結構。
在這裡插入圖片描述

在這裡插入圖片描述

樹的遍歷

先序遍歷(Pre-order)根-左-右

先根(次序)遍歷:若樹不空,則先訪問根結點,然後依次先根遍歷各棵子樹。
在這裡插入圖片描述

中序遍歷(In-order)左-根-右

在二叉樹中,中序遍歷首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。
在這裡插入圖片描述

後序遍歷(Post-order)左-右-根

後根(次序)遍歷:若樹不空,則先依次後根遍歷各棵子樹,然後訪問根結點。
在這裡插入圖片描述

按層次遍歷

按層次遍歷:若樹不空,則自上而下自左至右訪問樹中每個結點。
在這裡插入圖片描述