日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构(十八)树的定义与存储结构

發布時間:2024/6/30 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构(十八)树的定义与存储结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  一、樹的定義

  1.樹(Tree)是n(n>=0)個結點的有限集。n=0時稱為空樹。在任意一棵非空樹中:(1)有且僅有一個特定的稱為根(Root)的結點;(2)當n>1時,其余結點可分為m(m>0)個互不相交的有限集T1、T2、...Tm,其中每一個集合本身又是一棵樹,并且稱為根的子樹(SubTree)。

  2.結點分類:樹的結點包含一個數據元素及若干指向其子樹的分支。結點擁有的子樹數稱為結點的度(Degree)。度為0的結點稱為葉結點(Leaf)或終端結點;度不為0的結點稱為非終端結點或分支結點。除根結點之外,分支結點也稱為內部結點。樹的度是樹內各結點的度的最大值。

  3.結點間關系:結點的子樹的根稱為該結點的孩子(Child),該結點稱為孩子的雙親(Parent)。同一個雙親的孩子之間互稱為兄弟(Sibling),結點的祖先是從根到該結點所經分支上的所有結點,反之,以某結點為根的子樹中任一結點都稱為該結點的子孫。

  4.結點的層次(Level):從根開始定義起,根為第一層,根的孩子為第二層次。若某結點在第i層,則其子樹的根就在第i+1層。其雙親在同一層的結點互為堂兄弟。樹中結點的最大層次稱為樹的深度(Depth)或高度。

  5.如果將樹中結點的各子樹看成從左到右是有次序的,不能互換的,則稱該樹為有序樹,否則稱為無序樹。森林(Forest)是m(m>=0)棵互不相交的樹的集合。對樹中每個結點而言,其子樹的集合即為森林。

  二、樹的存儲結構

  樹的存儲結構有四種不同的表示法:雙親表示法、孩子表示法、雙親孩子表示法、孩子兄弟表示法。

  1.雙親表示法

  以一組連續空間存儲樹的結點,同時在每個結點中,附設一個指示器指示其雙親結點在數組中的位置。結點結構包括data數據域和parent指針域。約定根結點的位置與設置為-1。這種存儲結構,可以根據結點的parent指針很容易找到它的雙親結點,所用的時間復雜度為O(1),直到parent為-1時,表示找到了樹結點的根。但是,要知道結點的孩子是什么,只能遍歷整個結構才行。

  為了便于找到結點的孩子是什么,可以增加一個結點最左邊孩子的域firstchild,叫它長子域,這樣就很容易得到結點的孩子。如果沒有孩子的結點,這個長子域就設置為-1。對于有2個孩子來說,知道了長子,另一個當然就是次子了。

  為了便于體現各兄弟之間的關系,可以增加一個右兄弟域rightsib來記錄每個結點右兄弟的下標,如果右兄弟不存在,就設置為-1。

  2.孩子表示法

  由于樹中每個結點可能有多棵子樹,可以考慮用多重鏈表,即每個結點有多個指針域,其中每個指針指向一棵子樹的根結點,把這種方法叫做多重鏈表表示法。由于樹的每個結點的讀,也就是它的孩子個數是不同的,所以有兩種方案來解決。

  方案一:指針域的個數就等于樹的度,也就是各個結點度的最大值。適用于樹的各結點度相差很小的情況下,因為開辟的空間都被充分利用了。

  方案二:每個結點指針域的個數等于該結點的度,專門取一個位置來存儲結點指針域的個數。這種方法克服了浪費空間的缺點,對空間利用了是很高了,但是由于各個結點的鏈表是不相同的結構,加上要維護結點的度的數值,在運算上就會帶來時間上的損耗。

  孩子表示法既可以減少空指針的浪費又能使結點結構相同。具體辦法是,把每個結點的孩子結點排列起來,以單鏈表作為存儲結構,則n個結點有n個孩子鏈表,如果是葉子結點則次單鏈表為空。然后n個頭指針又組成一個線性表,采用順序存儲結構,存放進一個一維數組中。表頭數組的表結構包括data數據域和firstchild孩子鏈表頭指針域。孩子鏈表的孩子結點的結構包括child數據域,用來存儲某個結點在表頭數組中的下標,還有next指針域,用來存儲指向某結點的下一個孩子結點的指針。

  3.雙親孩子表示法

  對于孩子表示法來說,這樣的結構對于查找某個結點的某個孩子,或者找某個結點的兄弟,只需要查找這個結點的孩子單鏈表即可。對于遍歷整棵樹也是很方便的,對頭結點的數組循環即可。但是,要想知道某個結點的雙親是誰,就必須要遍歷整棵樹才行。可以把雙親表示法和孩子表示法綜合一下形成雙親孩子表示法,即在頭結點增加一個parent指針域即可。

  4.孩子兄弟表示法

  任意一棵樹,它的結點的第一個孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,可以將結點結構設計成這樣:data數據域,firstchild指針域用來存儲該結點的第一個孩子結點的存儲地址,rightsib指針域用來存儲該結點的右兄弟結點的存儲地址。

  孩子兄弟表示法,給查找某個結點的某個孩子帶來了方便,只需要通過firstchild找到次結點的長子,再通過長子結點的right找到它的二弟,接著一直下去,直到找到具體的孩子。

轉載于:https://www.cnblogs.com/BigJunOba/p/9208126.html

總結

以上是生活随笔為你收集整理的数据结构(十八)树的定义与存储结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。