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