理论基础 —— 树 —— 树的存储结构
【父親表示法】
由于樹中每個結(jié)點均有且僅有一個父結(jié)點,那么根據(jù)這一特性,用一維數(shù)組來存儲樹的各個結(jié)點(一般按層序存儲),數(shù)組中的一個元素對應(yīng)樹中的一個結(jié)點,每個結(jié)點記錄兩類信息:結(jié)點的數(shù)據(jù)信息、該結(jié)點的父親在數(shù)組中的下標(biāo)
優(yōu)缺點:利用了樹中除根結(jié)點外每個結(jié)點都有唯一的父結(jié)點這個性質(zhì),很容易找到樹根,但找孩子時需要遍歷整個線性表
template<class T> struct Node{T data;//數(shù)據(jù)域,存放該結(jié)點的數(shù)據(jù)信息int parent;//指針域,指向該結(jié)點的父結(jié)點 }tree[N];【孩子表示法】
樹的孩子表示法是基于鏈表的存儲方法,其缺陷是只能從父結(jié)點遍歷到子結(jié)點,不能從某個子結(jié)點返回到它的父結(jié)點,有兩種形式:
1.多重鏈表表示法
由于樹中的每個結(jié)點都可能有多個孩子,因此鏈表中的每個結(jié)點都包含一個數(shù)據(jù)域與多個指針域,每個指針域指向該結(jié)點的一個孩子結(jié)點。
由于樹中各節(jié)點的度不同,因此指針域的設(shè)置有兩種方法:
- 指針域的個數(shù)等于該結(jié)點的度:節(jié)省空間但各種操作不易實現(xiàn),適用于各節(jié)點的度相差較大、操作較少的情況
- 指針域的個數(shù)等于樹的度:浪費空間但各種操作容易實現(xiàn),適用于各節(jié)點的度相差不大、操作較多的情況
2.孩子鏈表表示法
用多個單鏈表來表示樹,將每個結(jié)點的孩子結(jié)點進行排列,看成一個線性表,并以單鏈表存儲,稱為該結(jié)點的孩子鏈表。
那么,n 個結(jié)點共有 n 個孩子鏈表,其中葉結(jié)點的孩子鏈表為空,即 n 個單鏈表共有 n 個頭指針,這 n 個頭指針又組成了一個線性表,將這存放 n 個頭指針的數(shù)組和存放 n 個結(jié)點的數(shù)組結(jié)合起來,構(gòu)成孩子鏈表的表頭數(shù)組
struct childNode{//孩子結(jié)點int child;childNode *next; }; template<class T> struct tableNode{//表頭結(jié)點T data;childNode *firstChild; };【父親孩子表示法】
父親孩子表示法是父親表示法、孩子鏈表表示法的結(jié)合。
父親孩子表示法仍將各結(jié)點的孩子分別組成單鏈表,同時用一維數(shù)組順序存儲樹中的各節(jié)點,數(shù)組元素除了包括結(jié)點的數(shù)據(jù)信息和該結(jié)點的孩子鏈表的頭指針外,還增設(shè)一指針域用于該結(jié)點的父結(jié)點在數(shù)組中的下標(biāo)。
template<class T> struct Node{T data;//數(shù)據(jù)域,存放數(shù)據(jù)信息Node<T> *child[m];//指針域,指向若干孩子結(jié)點Node<T> *father;//指針域,指向父親結(jié)點 };【孩子兄弟表示法】
孩子兄弟表示法又稱二叉鏈表表示法,是一種雙鏈表結(jié)構(gòu),其鏈表中的每個結(jié)點除數(shù)據(jù)域外,還設(shè)置了兩個指針分別指向該結(jié)點的第一個孩子和右兄弟。
template <class T> struct Node{T data;//數(shù)據(jù)域,存放數(shù)據(jù)信息Node<T> *firstChild;//指針域,存放該結(jié)點第一個孩子結(jié)點的地址Node<T> *rightBrother;//指針域,存放該結(jié)點的右兄弟的地址 };?
總結(jié)
以上是生活随笔為你收集整理的理论基础 —— 树 —— 树的存储结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 靶形数独(信息学奥赛一本通-T1447)
- 下一篇: 一维战舰(51Nod-1521)