樹基本概念
非線性結構,乙個直接前驅,但可能有多個直接後繼(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.樹中的節點存在三種 根節點 沒有前驅節點 葉子節點 沒有葉子節點 非葉子節點 可以包...