資料結構 樹

2021-09-11 14:01:51 字數 3704 閱讀 9809

樹是一種非線性的資料結構,右n(n>=0)個結點組成的有限集合,如果n=0,稱為空樹,如果n>0,則:

每個結點只有乙個雙親,所以選擇順序儲存佔主要

以一組連續空間儲存樹的結點,同時在每個結點中,附設乙個指示其雙親結點位置的指標域

1.結點結構

2.結點結構定義

/*樹的雙親表示法結點結構定義*/

#define max_tree_size 100

typedef int telemtype;

typedef struct ptnode //結點結構

ptnode;

typedef struct //樹結構

3.優缺點分析

缺點:由上向下找就十分慢,若要找結點的孩子或者兄弟,要遍歷整個樹
4.改進一:方便獲取孩子結點

在雙親結點基礎上加入孩子結點位置,由於可能乙個結點有多個子樹,所以我們要根據數的度來設定新增幾個孩子結點的元素

樹的度為3,所以我們在結點結構設定上新增3個指標域,指向孩子結點,若是孩子為空則位置為-1
/*樹的雙親表示法結點結構定義*/

#define max_tree_size 100

typedef int telemtype;

typedef struct ptnode //結點結構

ptnode;

typedef struct //樹結構

缺點:這樣消耗了大量的空間,是不必要的,

我們盡可能使用較小的空間,所以我們一般只新增乙個長子域,可以獲取到有0個或1個孩子結點,甚至兩個子樹都可以獲取,但是對於較多的孩子我們若是非得使用順序儲存,就得使用上面方法。

注意:長子域是最左邊孩子的域

/*樹的雙親表示法結點結構定義*/

#define max_tree_size 100

typedef int telemtype;

typedef struct ptnode //結點結構

ptnode;

typedef struct //樹結構

5.改進二:方便獲取各兄弟之間的關係

我們只需要增加乙個有兄弟域,即可依次獲取所有的兄弟結點
/*樹的雙親表示法結點結構定義*/

#define max_tree_size 100

typedef int telemtype;

typedef struct ptnode //結點結構

ptnode;

typedef struct //樹結構

儲存結構的設計是乙個十分靈活的過程。乙個儲存結構設計是否合理,取決於基於該儲存結構的運算是否合適,方便,時間複雜度好不好等。

例如若是我們既關注孩子又關注兄弟,而且對時間遍歷要求高,那麼我們可以擴充套件上面結構含有雙親域,長子域,右兄弟域

由於每個結點可有多個子樹(無法確定子樹個數),可以考慮使用多重鍊錶來實現。

根據樹的度來設定孩子域的個數,例如本例中度為3,設定3個孩子域
/*樹的孩子表示法結點結構定義*/

#define max_tree_size 100

typedef int telemtype;

typedef struct ptnode //結點結構

ptnode;

typedef struct //樹結構

缺點:占用了大量不必要的孩子域空指標

以其為標準:需要3n個指標域,實際上有用n-1個(除了根節點,其他n-1個都向上需要一條邊),則有2n+1個無用,浪費
改進一:為每個結點新增乙個結點度域,方便控制指標域的個數

缺點:維護困難,不易實現

改進三:結合順序結構和鏈式結構

/*樹的孩子表示法結點結構定義*/

#define max_tree_size 100

typedef int telemtype;

typedef struct ctnode //孩子結點

*childptr;

typedef struct //表頭結構

ctbox;

typedef struct //樹結構

ctree;

改進四:新增雙親域,方便查詢雙親結點(雙親孩子表示法)

/*樹的孩子表示法結點結構定義*/

#define max_tree_size 100

typedef int telemtype;

typedef struct ctnode //孩子結點

*childptr;

typedef struct //表頭結構

ctbox;

typedef struct //樹結構

ctree;

上面從雙親,孩子角度研究樹的結構,下面我們從樹的結點的兄弟角度來研究
任意一棵樹,他的結點的第乙個孩子如果存在就是唯一結點,他的右兄弟如果存在,也是唯一的,因此,我們設定兩個指標,分別指向該結點的第乙個孩子和該結點的右兄弟

n個結點,有2n個指標域,有n-1條邊,空n+1個指標域
typedef int telemtype;

typedef struct csnode

csnode,*cstree;

若有需要,可以再加入乙個雙親域,但是上面的結構以及轉換為二叉樹,我們可以使用二叉樹的一系列方法,來解決問題

資料結構 樹

樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...

資料結構 樹

1 定義 樹是一種非線性結構,是一種一對多的資料結構。分析樹的結構,我們用遞迴的方法,根結點下面又可以看做是子樹。2 樹的儲存結構 我們一般用孩子兄弟法儲存。也就是把乙個結點的左邊第乙個孩子放在此結點的左邊孩子,把此結點的右兄弟放在此結點的右邊孩子。這樣就產生了二叉樹。二叉樹和樹可以相互對應。3 二...

資料結構 樹

二叉樹性質回顧 滿二叉樹 完全二叉樹等 給定一棵二叉樹,要求分層遍歷該二叉樹,即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。我們在遍歷的過程中將該層節點的孩子節點壓入乙個佇列,這樣就可以實現從上到下一層一層地遍歷該二叉樹。層序遍歷 並分層列印 如果不用分層的話只用佇列...