homework 樹 二叉樹

2021-07-25 06:01:07 字數 2436 閱讀 3242

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。

一顆二叉樹中,如果所有的分支節點都存在左子樹和右子樹,並且所有的葉節點都在同一層上,這樣的一棵二叉樹稱作滿二叉樹。

定義:完全二叉樹是由滿二叉樹而引出來的。對於深度為k的,有n個結點的二叉樹,當且僅當其每乙個結點都與深度為k的滿二叉樹中編號從1至n的結點一一對應時稱之為完全二叉樹。滿二叉樹必定是完全二叉樹,完全二叉樹不一定是滿二叉樹。

若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的節點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。

一顆非空二叉樹第k層上最多有2k-1個節點。

一顆深度為k的二叉樹中,最多擁有2k-1個節點。

乙個非空的二叉樹,如果葉節點數為n0,度數為2的節點數為n2,則n0 = n2 + 1。

具有n個節點的完全二叉樹的深度為[log2n]+1。(高斯符號 = floor())

具有n個節點的完全二叉樹,如果按照從上至下和從左至右的順序對二叉樹中的所有節點從1開始順序編碼,則對於任意的序號為i的節點:

用一組連續的儲存單元存放二叉樹中的節點。一般是按照二叉樹的節點從上至下,從左至右的順序儲存。節點在儲存位置上關係並不一定就是他們在邏輯上的關係。

如上圖,樹按照從上至下,從左至右儲存到記憶體中。

索引0為根節點,索引為i的節點的子節點的索引為2i + 1和2i + 2,索引為i的父節點的索引為[(i - 1)/2]。

例如索引為2的節點的子節點索引為2 * 2 + 1 = 5和2 * 2 + 2 = 6,父節點為[(2 - 1) / 2] = 0。

但是上圖中用到的例子是乙個完全二叉樹,而非完全二叉樹使用順序儲存結構的話,要想獲取節點的子節點和父節點並且仍然滿足上面的公式,就需要把非完全二叉樹改造為完全二叉樹再儲存,否則就不會滿足上面的公式,而改造乙個非完全二叉樹為完全二叉樹,會造成大量的空間浪費。最壞的情況如下:一顆深度為k的右單支樹,卻需要分配2k - 1個儲存單元。

所以,順序儲存結構僅適用於完全二叉樹。

鍊錶中每個節點由三個域組成,資料域和兩個指標域(左子節點指標,右子節點指標)。

如果乙個節點的子節點不存在,相應的指標域值為空。

節點的儲存結構:

二叉煉表示意圖:

鍊錶中每個節點由四個域組成,比二叉鍊錶多了乙個指向父節點的指標域。

節點的儲存結構:

三叉煉表示意圖:

將二叉樹的根節點設為d,根節點的左子樹設為l,根節點的右子樹設為r。

那麼遍歷方式有:dlr,drl,ldr,lrd,rld,rdl。

限定先左後右,則僅有三種:dlr,ldr,lrd。

另外還有一種層次遍歷,就是按照從上至下,從左至右,對節點進行逐個訪問。

深度優先遍歷:先序遍歷,中序遍歷,後序遍歷。

廣度優先遍歷:層次遍歷。

中序遍歷:

後序遍歷

層次遍歷

層次遍歷演算法:

建立乙個佇列;

將根節點指標入佇列;

從佇列取出乙個元素;

訪問該元素所指的節點,若該元素所指節點的左,右子節點非空,則將該元素所指節點的左子節點指標和右子節點指標順序入佇列;

重複3步驟;

以上面的example1為例:

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

二叉樹,完全二叉樹,滿二叉樹

二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...