樹是一種非線性的資料結構,用來表示「一對多」的關係。樹是由唯一的根和若干棵互不相交的子樹組成。其中,當樹的結點數目為0時,這棵樹稱為一棵空樹。
樹中的結點數等於所有結點的度數+1
度為 m 的樹中第 i 層上至多有 mi−
1m^mi−1
個結點高度為 h 的 m 叉樹至多有 (mk
−1)/
(m−1
)(m^k-1)/(m-1)
(mk−1)
/(m−
1)個結點
結點數為 n 的 m 叉樹的最小高度為 ⌈lo
gm(n
(m−1
)+1)
⌉⌈log_m(n(m-1)+1)⌉
⌈logm
(n(m
−1)+
1)⌉用一組連續的空間來儲存樹中的結點,在儲存每個結點的同時附設乙個指示器來指示其雙親結點在表中的位置,其結點的結構如下
結點的定義:
typedef
struct ptnodeptnode;
樹的定義:
typedef
struct
ptree;
優點:利用了樹中每個結點(根結點除外)只有乙個雙親結點的性質,使得查詢某個結點的雙親結點非常容易。
缺點:
在求某個結點的孩子時,需要遍歷整個向量。
通常是把每個結點的孩子結點排列起來,構成乙個單鏈表,稱為孩子鍊錶。n個結點共有n個孩子鍊錶(葉結點的孩子鍊錶為空表),而n個結點的資料和n個孩子鍊錶的頭指標又組成乙個順序表。
孩子結點鍊錶的定義:
typedef
struct ctnode
*childptr;
結點順序表的定義:
typedef
struct
ctbox;
樹的定義:
typedef
struct
ctree;
優點:便於查詢孩子結點。
缺點:
在求某個結點的雙親結點時,需要遍歷整個向量。
使用孩子表示法儲存的樹結構,正好和雙親表示法相反,適用於查詢某結點的孩子結點,不適用於查詢其父結點。故可以將兩種表示方法合二為一
鍊錶中每個結點設有兩個鏈域,分別指向該結點的第乙個孩子結點和下乙個兄弟(右兄弟)結點,也稱為二叉鍊錶表示法。
結點和樹的定義:
typedef
struct csnodecsnode,
*cstree;
樹的儲存結構
樹的儲存結構 樹的存貯結構有多種表示方法,比較典型的乃是順序結構和鍊錶結構兩類。順序存貯結構即向量,一般將樹結點按自上而下,自左至右的順序一一存放。如前文所介紹的完全二叉樹就可以採用順序存貯結構。1.雙親鍊錶表示法 順序儲存結構常用的有雙親表示法,這種方法在每個陣列元素中存放某個結點資訊和該結點的雙...
樹的儲存結構
樹的資料邏輯結構是一對n的,除了根節點,每個元素只有乙個前驅,但是可以有多個後繼,具有層次關係,像家譜就是乙個樹的例子。樹是有n個結點的有限集合,當n大於零時,這個樹有且僅有乙個稱為根的結點,從根節點延申出來的元素可以時n個,同時可以再延申。n 0時,該樹就是空樹。樹的第一層就是根結點,第二層都是稱...
樹的儲存結構
1 第一行乙個n,代表這個樹有n個節點,接下來輸入n行,第i行輸入兩個數字,li,ri,代表第i個節點的左兒子右兒子 節點序號從1編號到n 如果沒有左兒子或者右兒子,就用 1代替,輸出它的層序遍歷 include include include using namespace std struct ...