1. 程式人生 > >資料結構--樹型別及樹的基本概念

資料結構--樹型別及樹的基本概念

資料結構中的幾種樹

序號 型別 具體型別 具體型別 具體型別 具體型別 具體型別
1 二叉樹 ⑴二叉樹 ⑵二叉查詢樹 ⑶笛卡爾樹 ⑷T樹 ⑸Top Tree
2 自平衡二叉查詢樹 ⑴紅黑樹 ⑵平衡二叉樹(AVL) ⑶伸展樹 ⑷樹堆 ⑸節點大小平衡樹
3 B樹 ⑴B樹 ⑵B+樹(AVL) ⑶B*樹 ⑷UB樹 ⑸2-3樹
⑹2-3-4樹 ⑺(a,b)-樹 ⑻Dancing tree ⑼H樹
4 Trie 字首樹 字尾樹 基數樹
5 空間劃分樹 ⑴四叉樹 ⑵八叉樹 ⑶k-d樹 ⑷vp樹 ⑸R樹
⑹R-樹 ⑺X樹 ⑻M樹 ⑼線段樹 ⑽希爾伯特R樹
⑾優先R樹
6 非二叉樹 are neat
7 其他型別 are neat

樹的概念

1. 樹與子樹

樹(Tree)是n(n>=0)個結點的有限集。在任意一棵非空樹中:
⑴有且僅有一個特定的稱為根的結點
⑵當n>1時,其餘結點可分為m(m>0)個互不相交有限集T1,T2,……,Tm ,其中每一個集合本身又是一棵樹,並且稱為根的**子樹**

2.樹的基本資料操作

  • ADT Tree{

    • 資料物件D:D是具有相同特性的資料元素的集合。
    • 資料關係R:若D為空集,則稱為空樹;
      • 若D僅含一個數據元素,則R為空集,否則R={H},H是如下二元關係:
        ⑴在D中存在唯一的稱為根的資料元素rrot,他在關係H下無前驅
        ⑵若D-{root}!=空集合,則存在D-{root}的一個劃分D1,D2,……,Dm(m>0),對任意 j!=k(1<=j,k<=m)有Dj∩Dk=空集,且對於任意的i(1<=i<=m)唯一存在資料元素Xi屬於Di,有{root,Xi}屬於H;
        ⑶對應於D-{root}的劃分,H-{{root,xi},……,{root,xm}}有唯一的一個劃分H1,H2,……,Hm(m>0),對任意j!=k(1<=j,k<=m)有Hj∩Hk=空集,且對於任意的i(1<=i<=m),Hi是Di上的二元關係,(Di,{Hi})是一棵符合本定義的樹,稱為根root的子樹
    • 基本操作P:

      ⑴ InitTree(&T);
         操作結果:構造空樹T。
      ⑵ DestroyTree(&T)
         初始條件:樹T存在。
         操作結果:銷燬樹T。
      ⑶CreateTree(&T,definition):
          初始條件:definition給出樹T的定義
          操作結果:按definition構造樹T
      ⑷ClearTree(&T)
          初始條件:樹T存在
          操作結果:將樹T清為空樹
      ⑸TreeEmpty(T)
          初始條件:樹T存在
          操作結果:若T為空樹,則返回TRUE,否則FALSE
      ⑹Root(T)
          初始條件:樹T存在
          操作結果:返回T的根
      ⑺Value(T,cur_e)
          初始條件:樹T存在,cur_e是T中某個結點。
          操作結果:返回cur_e的值
      ⑻Assign(T,cur_e, value)
          初始條件:樹T存在
          操作結果:結點cur_e賦值為value
      ⑼Parent(T,cur_e)
          初始條件:樹T存在,cur_e是T中某個結點。
          操作結果:若cur_e是T的非根節點,則返回它的雙親,否則函式值為“空”。
      ⑽LeftChild(T,cur_e)
          初始條件:樹T存在,cur_e是T中某個結點。
          操作結果:若cur_e是T的非葉子結點,則返回它的最左孩子,否則返回“空”
      ⑾RightSibling(T,cur_e)
          初始條件:樹T存在,cur_e是T中某個結點。
          操作結果:若cur_e有右兄弟,則返回它的右兄弟,否則函式值為“空”
      ⑿InsertChild(&T,&p,i,c)
          初始條件:樹T存在,p指向T中某個結點,1<=i<=p所指結點的度+1,非空樹c與T不想交。
          操作結果:插入c為T中p指結點的第i棵子樹
      ⒀DeleteChild(&T,&p,i)
          初始條件:樹T存在,p指向T中某個結點,1<=i<=p指結點的度
          操作結果:刪除T中p所指結點的第i棵子樹。
      ⒁TraverseTree(T,Visit())
          初始條件:樹T存在,Visit是對結點操作的應用函式。
          操作結果:按某種次序對T的每個結點呼叫函式Visit()一次且至多一次。一旦Visit()失敗,則操作失敗
      

3.樹的基本術語

結點的度:樹中一個結點的子節點個數稱為結點的度
樹的度:樹中結點的最大度數稱為樹的度
分支結點:度大於0的結點(又稱為非終端結點)
葉子結點:度等於0(沒有子女結點)的結點稱為葉子結點。
結點的層次:從樹根開始定義,根結點為第一層 (有的也把根結點當為第0層)
結點的深度:是從根節點開始自頂向下逐層累加的
節點的高度:從根節點開始自底向上逐層累加
樹的高度(又叫深度):是樹中結點的最大層數
路徑和路徑長度:樹中兩個結點之間的路徑是由這兩個結點之間所經過的結點序列構成的。路徑長度是路徑上所經過的邊的個數。
有序樹:如果將樹中結點的各子樹看成從左至右是有次序的(即不能互換),則稱該樹是有序數,否則稱為無序樹
森林:是m(>=0)棵互不相交的樹的集合。森林的概念與樹的概念十分相近,因為只要把樹的跟刪除就成了森林。