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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

理论基础 —— 树 —— 树的存储结构

發布時間:2025/3/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理论基础 —— 树 —— 树的存储结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【父親表示法】

由于樹中每個結點均有且僅有一個父結點,那么根據這一特性,用一維數組來存儲樹的各個結點(一般按層序存儲),數組中的一個元素對應樹中的一個結點,每個結點記錄兩類信息:結點的數據信息、該結點的父親在數組中的下標

優缺點:利用了樹中除根結點外每個結點都有唯一的父結點這個性質,很容易找到樹根,但找孩子時需要遍歷整個線性表

template<class T> struct Node{T data;//數據域,存放該結點的數據信息int parent;//指針域,指向該結點的父結點 }tree[N];

【孩子表示法】

樹的孩子表示法是基于鏈表的存儲方法,其缺陷是只能從父結點遍歷到子結點,不能從某個子結點返回到它的父結點,有兩種形式:

1.多重鏈表表示法

由于樹中的每個結點都可能有多個孩子,因此鏈表中的每個結點都包含一個數據域與多個指針域,每個指針域指向該結點的一個孩子結點。

由于樹中各節點的度不同,因此指針域的設置有兩種方法:

  • 指針域的個數等于該結點的度:節省空間但各種操作不易實現,適用于各節點的度相差較大、操作較少的情況
  • 指針域的個數等于樹的度:浪費空間但各種操作容易實現,適用于各節點的度相差不大、操作較多的情況
//指針域的個數等于該結點的度 template<class T> struct Node{T data;//數據域,存放數據信息int degree;//度域,存放該結點的度int child[degree];//指針域,child[i]指向該結點的第i個孩子 }tree[N];//指針域的個數等于樹的度 template<class T> int num;//num為樹的度 struct Node{T data;//數據域,存放數據信息int child[num];//指針域,child[i]指向該結點的第i個孩子 }tree[N];

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;//指針域,存放該結點的右兄弟的地址 };

?

總結

以上是生活随笔為你收集整理的理论基础 —— 树 —— 树的存储结构的全部內容,希望文章能夠幫你解決所遇到的問題。

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