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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法)

發(fā)布時(shí)間:2023/12/8 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一. 樹(shù)的概念
  • 二. 樹(shù)的存儲(chǔ)結(jié)構(gòu)
      • (一). 雙親表示法
      • (二). 孩子表示法
          • 1. 定長(zhǎng)結(jié)點(diǎn)鏈表存儲(chǔ)結(jié)構(gòu)
          • 2. 孩子鏈表存儲(chǔ)結(jié)構(gòu)
      • (三). 孩子兄弟表示法

一. 樹(shù)的概念

  • 樹(shù)(Tree)是n(n>=0)個(gè)結(jié)點(diǎn)的有限集。
  • 當(dāng) n = 0 時(shí),稱為空樹(shù)。
  • 在任意一顆非空樹(shù)中:
    • 有且僅有一個(gè)特定的稱為 根(Root) 的結(jié)點(diǎn);
      如上圖,A為根
    • 當(dāng) n > 1 時(shí),其余結(jié)點(diǎn)可分為m(m > 0)個(gè)互不相交的有限集T1,T2,T3…Tm,其中每一個(gè)集合本身又是一顆樹(shù),并且稱為根的子樹(shù)。
      B,C,D稱為A的子樹(shù)
  • 樹(shù)的結(jié)點(diǎn)包含一個(gè)數(shù)據(jù)元素及若干指向其子樹(shù)的分支。
  • 結(jié)點(diǎn)擁有的子樹(shù)個(gè)數(shù)稱為結(jié)點(diǎn)的度。
    A的子樹(shù)個(gè)數(shù)有3個(gè),即度為3。B的子樹(shù)個(gè)數(shù)為0,即度為0。
  • 度為0的結(jié)點(diǎn)稱為葉子或終端結(jié)點(diǎn)。
    B,H,F,G的度為0,即B,H,F,G稱為葉子結(jié)點(diǎn)。
  • 度不為0的結(jié)點(diǎn)稱為非終端結(jié)點(diǎn)或分支結(jié)點(diǎn)。
    如A,C,D,E。
  • 樹(shù)的度是樹(shù)內(nèi)各結(jié)點(diǎn)的度的最大值。
    A的度為3,在所有結(jié)點(diǎn)中式最大的,即樹(shù)的度就是3。
  • 結(jié)點(diǎn)的子樹(shù)的根稱為該結(jié)點(diǎn)的孩子,相應(yīng)的,該結(jié)點(diǎn)稱為孩子的雙親。
    結(jié)點(diǎn)H是結(jié)點(diǎn)E的孩子結(jié)點(diǎn),反之,E是H的雙親結(jié)點(diǎn)。
  • 同一個(gè)雙親的孩子之間互稱為兄弟。
    E和F互為兄弟。
  • 結(jié)點(diǎn)的祖先是從根到該結(jié)點(diǎn)所經(jīng)分支上的所有結(jié)點(diǎn),反之,以某結(jié)點(diǎn)的根的子樹(shù)中的任一結(jié)點(diǎn)都稱為該結(jié)點(diǎn)的子孫。
    H的祖先是A,C,E。 C的子孫是E,F,H。
  • 結(jié)點(diǎn)的層次從根開(kāi)始定義起,根為第一層,根的孩子為第二層。
  • 若某結(jié)點(diǎn)在第 l 層,則其子樹(shù)的根就在第 l + 1 層。其雙親在同一層的結(jié)點(diǎn)互稱為堂兄弟。
  • 樹(shù)中結(jié)點(diǎn)的最大層次稱為樹(shù)的深度或高度。
    圖中樹(shù)的深度為3。
  • 如果將樹(shù)中結(jié)點(diǎn)的各子樹(shù)看成從左至右是有序次的(即不能互換),則稱該樹(shù)為有序樹(shù),否則稱為無(wú)序樹(shù)。
  • 二. 樹(shù)的存儲(chǔ)結(jié)構(gòu)

    (一). 雙親表示法

  • 這種存儲(chǔ)結(jié)構(gòu)是一種順序存儲(chǔ)結(jié)構(gòu),用一組連續(xù)空間存儲(chǔ)樹(shù)的所有結(jié)點(diǎn),同時(shí)在每個(gè)結(jié)點(diǎn)中附設(shè)一個(gè)下標(biāo)(偽指針)指示其雙親結(jié)點(diǎn)的位置。
  • 結(jié)點(diǎn)結(jié)構(gòu)表示為:

    data值就是結(jié)點(diǎn)的數(shù)據(jù)值,parent表示這個(gè)數(shù)據(jù)結(jié)點(diǎn)的雙親結(jié)點(diǎn)在這個(gè)空間中存放的位置。


  • 可表示為:
  • 因?yàn)閜arent指向雙親的位置,并沒(méi)有指向孩子結(jié)點(diǎn)的指針,因此使用雙親表示法找出雙親結(jié)點(diǎn)的時(shí)間復(fù)雜度為O(1),找出孩子結(jié)點(diǎn)必須要全部遍歷一遍,時(shí)間復(fù)雜度為O(n)。
  • 雙親存儲(chǔ)結(jié)構(gòu)的類型聲明:
  • #define MAX_TREE_SIZE 100struct PTNode{TElem Type data;int parent; //雙親位置域 };struct PTree{PTNode nodes[MAX_TREE_SIZE];int r,n; //根的位置,結(jié)點(diǎn)數(shù) };

    (二). 孩子表示法


    由于樹(shù)中每個(gè)結(jié)點(diǎn)可能有多棵子樹(shù),則可用多重鏈表,即每個(gè)結(jié)點(diǎn)有多個(gè)指針域,其中每個(gè)指針指向一棵子樹(shù)的根節(jié)點(diǎn),此時(shí)鏈表中的結(jié)點(diǎn)可以有如下兩種結(jié)點(diǎn)格式:

    1. 定長(zhǎng)結(jié)點(diǎn)鏈表存儲(chǔ)結(jié)構(gòu)

    孩子鏈表存儲(chǔ)結(jié)構(gòu)可按樹(shù)的度設(shè)計(jì)結(jié)點(diǎn)的孩子結(jié)點(diǎn)指針域個(gè)數(shù)

    2. 孩子鏈表存儲(chǔ)結(jié)構(gòu)
  • 把每個(gè)結(jié)點(diǎn)的孩子結(jié)點(diǎn)排列起來(lái),看成是一個(gè)線性表,且以單鏈表作存儲(chǔ)結(jié)構(gòu),則n個(gè)結(jié)點(diǎn)有n個(gè)孩子鏈表(葉子的孩子鏈表為空表)。
    而n個(gè)頭指針又組成一個(gè)線性表,為了便于查找,可采用順序存儲(chǔ)結(jié)構(gòu)。如下圖:
  • 為此,需要設(shè)計(jì)兩種結(jié)點(diǎn)結(jié)構(gòu):
  • 樹(shù)的孩子鏈表孩子兄弟表示:
  • typedef struct CTNode{ //孩子結(jié)點(diǎn) struct CTNode *next;int child; };typedef struct{TElem data;ChildPtr firstchild; //孩子鏈表頭指針 }CTBox; typedef struct {CTBox nodes[MAX_TREE_SIZE];int r,n; //根的位置,結(jié)點(diǎn)數(shù) }CTree;

    (三). 孩子兄弟表示法

  • 又稱二叉樹(shù)表示法,或二叉鏈表表示法。
  • 以二叉鏈表作樹(shù)的存儲(chǔ)結(jié)構(gòu)。鏈表中結(jié)點(diǎn)的兩個(gè)鏈域分別指向該結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn)和下一個(gè)兄弟結(jié)點(diǎn),分別命名為 firstchild域和 nextchild域。
  • 樹(shù)的二叉鏈表(孩子—兄弟)存儲(chǔ)表示:
  • typedef struct CSNode{TElemType data;CSNode *firstchild, *nextchild; }CSNode *CSTree;

    總結(jié)

    以上是生活随笔為你收集整理的树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。