資料結構學習記錄14 樹與二叉樹

2021-10-10 16:50:16 字數 3921 閱讀 4906

二.二叉樹

4.二叉樹的遍歷

三.程式設計原理

四.**實現

本來上一章應該還有稀疏矩陣的十字鍊錶儲存廣義表

但是廣義表,更多的是偏向於題目,了解下概念,能計算就行了。廣義表從某種程度來說,也算是一棵樹。

樹是乙個n(>=0)個結點的有限集。

在任意一顆非空樹中:

有且僅有乙個特定的結點叫做根結點rootn>1時,其餘結點可以分為m>0個互不相交的有限集t1……tm。其中,每乙個集合的本身又是一顆樹,並且被稱為根的子樹

所以,樹的結構定義因該是乙個遞迴的定義。

除了我們常見的樹狀圖表示法,還有:

巢狀集合表示法(a)

廣義表表示法(b)

樹的結點包含乙個資料元素及若干指向其子樹的分支。

結點擁有的的子樹稱為結點的度(degree)

度為0的結點,稱為葉子終端結點

度不為0的結點,稱為分支結點非終端結點樹的度是樹內各結點的度的最大值。

結點的子樹的根,稱為該結點的孩子;相應的,該結點是孩子的雙親

同乙個雙親的結點,它們互稱為兄弟結點的層次從根開始定義,根為第一層,根的孩子在第二層。某結點在n層,那麼其子樹的根就在n+1層。雙親在同一層的結點叫做堂兄弟

樹中結點的最大層次稱為樹的深度或高度

如果將各子樹看作從左至右是有次序的,那麼稱該樹是有序樹,否則為無序樹

在有序樹中,最左邊的子樹的根稱為第乙個孩子,最右邊的稱為最後乙個孩子森林m>=0棵互不相交的樹的集合。對於樹中每個結點而言,其子樹的集合即位森林。

就邏輯結構而言,任意一棵樹是乙個二元組tree=(root,f),其中root是資料元素,稱作樹的根結點;f是m>=0棵樹的森林,f=(t1……tm),其中ti=(ri, fi稱做根root的第i棵子樹。

如果研究一顆樹,那麼肯定要從最簡單的情況開始研究。當我們每個結點有乙個孩子的時候,那麼這不就是鍊錶嗎?所以我們研究樹,一般採用結點有兩個孩子的樹,叫做二叉樹。

這裡給出一些性質而不給出證明。證明起來也很容易(大概)。

在二叉樹的第i層上至多有2i-1個結點。

深度為k的二叉樹最多有2k-1個結點(k>=1)。

對於任意一顆二叉樹。如果其終端結點數為m,度為2的節點數為n,則m=n+1。

一顆深度為k,且有2k-1個結點的二叉樹稱為滿二叉樹

對滿二叉樹進行編號,約定編號從根結點開始,從上至下,從左至右。當一顆樹每乙個結點都與這種方式的滿二叉樹的方式一一對應,稱之為完全二叉樹。它有兩個特點: a)葉子結點只可能在層次最大的兩層上出現。 b) 對任意結點,其右分支下的子孫最大層次為l,那麼其左下分支下子孫的最大層次必為l或l+1.

具有n個結點的完全二叉樹的深度為log2n +1

如果有一顆有n個結點的完全二叉樹,且遵循剛才描述的編號方法,對任意一結點i (1<=i<=n)有:a) 如果i=1,則結點i是二叉樹的根,無雙親。如果i>1,則雙親結點的編號是i/2。b)如果2i>n,則結點無左孩子,否則其左孩子是結點2i。c)如果2i+1>n,則結點i無右孩子,否則其右孩子的編號是結點2i+1 。

順序儲存一般用於完全二叉樹。如果用於非完全二叉樹,可能會造成大量的空間浪費。

由結構來看,乙個結點它除了資料域,還有左右指標域。那麼最簡單的鍊錶就包含了這三個部分。可以理解為單向鍊錶x2。

在三叉煉表裡,它比二叉鍊錶多了乙個雙親結點的指標。很類似於雙向鍊錶。

在二叉樹的一些應用中,常常要求在樹中查詢具有某種特徵的點,或者對樹中全部結點逐一進行某種處理。這就提出了乙個遍歷二叉樹的問題。按某種搜尋路徑巡防樹中的每個結點,使得每個結點只被訪問一次。假設我們有乙個1234567的完全二叉樹,作為接下來三種遍歷的例子。遍歷都是基於對非空結點的操作。

訪問根結點。

先序遍歷左子樹。

先序遍歷右子樹。

遍歷結果:1245367

中序遍歷左子樹。

訪問根結點。

中序遍歷右子樹。

遍歷結果:4251637

後序遍歷左子樹。

後序遍歷右子樹。

訪問根結點。

遍歷結果4526731

在這篇文章中,我們採用最簡單的二叉鍊錶+遍歷實現。首先我們還是建立乙個資料域的結構體,然後乙個結點的結構體,包含兩個指向左右兒子結點的指標和乙個資料域結構體。

我們通過先序遍歷的方法,讀入一顆樹並構建出這棵二叉樹。當然,為了知道每棵樹的終端結點,我們需要把終端結點的兒子用虛結點,隨意的字元表示。在此約定為#,比如abc這棵深度為2的樹,我們需要輸入ab##c##

我們的遍歷因該遍歷到虛結點,如果字元為#則,該結點值為null,如果非#,則結點的資料域存入該字元,並建立兒子結點。

如果我們遇到了#結點,那麼就停止遞迴,這是我們的遞迴邊界。

否則就按照某種遍歷方式去遍歷並輸出結點字元即可。

#include

#include

#define ok 1

#define error 0

typedef

struct datatypedatatype;

typedef

struct btreebtree;

intbtreecreat

(btree *

*treeptr)

;// 通過先序遍歷的方式建立二叉樹

intbtreeshowdlr

(btree *root)

;// 三種遍歷

intbtreeshowldr

(btree *root)

;int

btreeshowlrd

(btree *root)

;int

main()

intbtreecreat

(btree *

*treeptr)

else

//非空

return ok;

}int

btreeshowdlr

(btree *root)

// 因為遍歷不會對結點位址進行改變,所以不需要二重指標

// 為空沒有任何操作

return ok;

}int

btreeshowldr

(btree *root)

return ok;

}int

btreeshowlrd

(btree *root)

return ok;

}

資料結構學習筆記11 樹與二叉樹

1.樹的定義 樹是n個結點的有限集。在任意一顆非空樹中應滿足 1 有且僅有乙個特定的稱為根 root 的結點 2 當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每乙個集合本身又是一棵樹,並且稱為根的子樹。每棵子樹的根節點有且僅有乙個直接前驅,但可以有0個或多個直接後繼。由此可以看到,...

資料結構學習(1) 二叉樹

二叉樹結構 public class treenode 前序遍歷 根結點,左子樹,右子樹 public static void prenode treenode node,listtreelist 中序遍歷 左子樹,根結點,右子樹 public static void midnode treenod...

資料結構學習筆記 二叉樹

樹,非線性表結構 樹有三個概念 高度從下向上數,起點是0 深度從上向下數,起點是0 層數從上向下數,起點是1 每個節點最多兩個叉 有兩種特殊二叉樹 滿二叉樹,除了葉子節點,每個節點都有左右兩個子節點 完全二叉樹,葉子節點都在最底下兩層,最後一層葉子節點都靠左排列,且除了最後一層,其它層節點個數都達到...