樹 二叉樹的基本概念

2021-09-26 06:41:17 字數 3148 閱讀 1200

樹基本概念

非線性結構,乙個直接前驅,但可能有多個直接後繼(1:n)

樹的定義具有遞迴性,即樹中還有樹

根 葉子 森林

有序樹 無序樹

雙親 孩子 兄弟 堂兄弟 祖先 子孫

結點 結點的度 結點的層次 終端結點 分支結點

樹的度 所有結點度中的最大值(max

樹的深度指所有結點中最大的層數(max

(或高度)

關於子樹不相交的說明

樹的表示法

圖形表示法

廣義表表示法

左孩子-右兄弟表示法

雙親孩子表示法

樹的邏輯結構

一對多(1:n),有多個直接後繼(如家譜樹、目錄樹等等),但只有乙個根結點,且子樹之間互不相交。

廣義表表示法

左孩子-右兄弟表示法

樹的儲存

順序儲存、鏈式儲存

二叉樹1、基本概念

二叉樹的結構最簡單,規律性最強

可以證明,所有樹都能轉為唯一對應的二叉樹,不失一般性

定義:是n(n≥0)個結點的有限集合,由乙個根結點以及兩棵互不相交的、分別稱為左子樹和右子樹的二叉樹組成

二叉樹性質

性質1: 在二叉樹的第i層上至多有2i-1個結點(i>0)

性質2: 深度為k的二叉樹至多有2k-1個結點(k>0)

性質3: 對於任何一棵二叉樹,若2度的結點數有n2個,則葉子數(n0)必定為n2+1 (即n0=n2+1)

滿二叉樹:一棵深度為k 且有2k -1個結點的二叉樹。

(特點:每層都「充滿」了結點)

完全二叉樹:深度為k 的,有n個結點的二叉樹,當且僅當其每乙個結點都與深度為k 的滿二叉樹中編號從1至n的結點一一對應。

性質4: 具有n個結點的完全二叉樹的深度必為log2n+1

性質5: 對完全二叉樹,若從上至下、從左至右編號,則編號為i 的結點,其左孩子編號必為2i,其右孩子編號必為2i+1;其雙親的編號必為i/2(i=1 時為根,除外)

二叉樹的儲存結構

一、順序儲存結構

按二叉樹的結點「自上而下、從左至右」編號,用一組連續的儲存單元儲存。

答:一律轉為完全二叉樹!

討論:不是完全二叉樹怎麼辦?

方法很簡單,將各層空缺處統統補上「虛結點」,其內容為空

二、鏈式儲存結構

二叉樹結點資料型別定義:

typedef struct node *tree_pointer;

typedef struct node node;

樹的三叉鍊錶表示

2、遍歷二叉樹

樹的性質確認

樹的遍歷引申

3、二叉樹程式設計實踐

typedef struct node node;

node *root;

dlr(node *root )

}中序遍歷演算法

ldr(node *root)

}後序遍歷演算法

lrd (node *root)

}練習例:編寫遞迴演算法,計算二叉樹中葉子結點的數目

dlr_countleafnum(node *root)//採用中序遍歷的遞迴演算法

dlr_countleafnum(root->lchild); //遞迴遍歷左子樹,直到葉子處;

dlr_countleafnum(root->rchild);}//遞迴遍歷右子樹,直到葉子處;

} return(0);

}前序遍歷

思路:利用前序遍歷來建樹(結點值陸續從鍵盤輸入,用dlr為宜)

bintree createbtpre( )

return t;

}後序遍歷銷毀乙個數

結論:通過中序遍歷和先序遍歷可以確定乙個樹

通過中序遍歷和後續遍歷可以確定乙個數。

通過先序遍歷和後序遍歷確定不了乙個數。

4、二叉線索樹

概念普通二叉樹只能找到結點的左右孩子資訊,而該結點的直接前驅和直接後繼只能在遍歷過程中獲得。

若可將遍歷後對應的有關前驅和後繼預存起來,則從第乙個結點開始就能很快「順藤摸瓜」而遍歷整個樹了。

線索化過程就是在遍歷過程(假設是中序遍歷)中修改空指標的過程:

將空的lchild改為結點的直接前驅;

將空的rchild改為結點的直接後繼。

二叉樹線索化演算法

void intreading(bithrtree p)

//中序遍歷進行中序線索化

if (!pre->rchild) /後繼線索/

pre=p;

inthreading(p->rchild); /右子樹線索化/}}

二叉樹線索化遍歷演算法

程式註解 (非遞迴,且不用棧):

p=t->lchild; //從頭結點進入到根結點;

while( p!=t)

//若有後繼標誌,則直接提取p->rchild中線索並訪問後繼結點;

p=p->rchild; //當前結點右域不空或已經找好了後繼,則一律從結點的右子樹開始重複的全部過程。

}return ok;

5、霍夫曼樹

對於文字」badcadfeed」的傳輸而言,因為重複出現的只有

」abcdef」這6個字元,因此可以用下面的方式編碼:

接收方可以根據每3個bit進行一次字元解碼的方式還原文字資訊。

這樣的編碼方式需要30個bit位才能表示10個字元

那麼當傳輸一篇500個字元的情報時,需要15000個bit位

在戰爭年代,這種編碼方式對於情報的傳送和接受是很低效且容易出錯的。

如何提高收發效率?

要提高效率,必然要從編碼方式的改進入手,要避免每個字元都占用相同的bit位

準則:任一字元的編碼都不是另乙個字元編碼的字首!

霍夫曼樹

1.給定n個數值

2.根據這n個數值構造二叉樹集合f

f =

ti的資料域為vi,左右子樹為空

3.在f中選取兩棵根結點的值最小的樹作為左右子樹構造一棵新的二叉樹,這棵二叉樹的根結點中的值為左右子樹根結點中的值之和

4.在f中刪除這兩棵子樹,並將構造的新二叉樹加入f中

5.重複3和4,直到f中只剩下乙個樹為止。這棵樹即霍夫曼樹

假設經過統計abcdef在需要傳輸的報文**現的概率如下

霍夫曼樹是一種特殊的二叉樹

霍夫曼樹應用於資訊編碼和資料壓縮領域

霍夫曼樹是現代壓縮演算法的基礎

二叉樹 基本概念

1.二叉樹的定義 二叉樹的定義是以遞迴形式給出的 一棵二叉樹是結點的乙個有限集合,該集合或者為空,或者是由乙個根節點加上兩棵分別稱為左子樹和右子樹的 互不相交的二叉樹組成。二叉樹有5種基本形態,如圖1所示,任何複雜的二叉樹都是這5種基本形態的復合,其中圖 a 是空二叉樹,圖 b 是單結點的二叉樹,圖...

二叉樹基本概念

五種形態 1.空二叉樹 2.僅有根節點的二叉樹 3.右子樹為空的二叉樹 4.左子樹為空的二叉樹 5.左右子樹都是非空的二叉樹 二叉樹的術語 節點 度 葉子 雙親 兄弟 孩子 子孫 有序樹 無序樹 二叉樹的五種性質 1.二叉樹的第i層至多又2 i 1 個結點 2.深度為k的二叉樹至多有2 k 1個結點...

樹與二叉樹基本概念

1.樹屬於邏輯非線性結構。2.如果乙個節點有後繼節點,那麼該節點可以有n多個後繼節點 如果乙個節點有前驅節點,那麼該樹只有乙個前驅節點 只有根節點沒有前驅節點,其他節點都有前驅節點 一棵沒有任何節點的樹稱為空樹。3.樹中的節點存在三種 根節點 沒有前驅節點 葉子節點 沒有葉子節點 非葉子節點 可以包...