為了實現樹,樹中的每乙個節點除資料外還要有一些指標,使得該節點的每乙個孩子節點都有乙個指標指向它。實際中由於樹中某個節點的孩子節點數可以變化很大且事先不知道,故在樹的資料結構中建立到各孩子節點直接的鏈結是不可行的(假如這樣做會產生太多的浪費空間)。
實際上比較簡單的做法:將樹中每個節點的所有孩子節點都放在樹節點的鍊錶中。具體宣告如下:
typedef
struct treenode *ptrtonode;
struct treenode
下圖的樹結構中,向下的箭頭是指向某個節點的firstchild(第一孩子)的指標,從左到右的箭頭是指向該節點的nextsibling(下一兄弟)的指標。因為空指標太多,故沒有把它們畫出來。
在上圖中,節點c有乙個指標(nextsibling)指向兄弟節點e,另乙個指標(firstchild)指向孩子節點d;有些節點(如d、h、k和m等)這兩種指標均沒有。
樹有很多應用,比較廣泛流行的用法是包括unix、vax/vms和dos等常用作業系統中的目錄結構。
二叉樹(binary tree)是一棵樹,其中每個節點都不能有多於2個的孩子(子樹),且二叉樹節點的孩子(子樹)有左右之分,次序不能顛倒。由此定義可知在二叉樹中不存在度【某個節點擁有的孩子(子樹)的數目】大於2的節點。
二叉樹的平均深度要比n(樹的總節點數)小很多,這個平均深度為o(sqrt(n)),最大深度可以大到(n-1)。
通常採用鏈式儲存二叉鍊錶和順序儲存陣列這2種方法來儲存二叉樹,其中二叉鍊錶法因為靈活、方便操作的特點而被經常使用。二叉樹的二叉鍊錶儲存結構如下**和圖所示:
typedef
struct binarytreenode *ptrtonode;
typedef
struct ptrtonode tree;
struct binarytreenode
;______________________________
typedef
struct binarytreenode
binarytreenode,*binarytree;
二叉樹節點宣告
對應舉例說明二叉樹的二叉鍊錶儲存過程
二叉樹的性質:
(1)在二叉樹中的第i層上至多有2^(i-1)個節點(i≥1);
(2)層數(有說深度的)為k的二叉樹至多有2^k-1個節點(k≥1);
(3)對任何一棵二叉樹t,如果其終端節點(度為0)的數目為n0,度為2的節點數目為n2,則n0=n2+1。
滿二叉樹:層數為k且具有2^k-1個節點的二叉樹,即滿二叉樹中的每一層上的節點數都是最大的節點數,所有終端都在同乙個層次,且非終端節點的度都為2;
完全二叉樹:層數為k且具有n個節點的二叉樹,當且僅當每乙個節點與層數為k的滿二叉樹中的編號從1至n的節點一一對應;對於完全二叉樹,設某個節點的編號為i,則其父節點的編號為floor(i/2),2*i為它的左子節點,(2*i+1)為它的右子節點。
結論:滿二叉樹和完全二叉樹是2種特殊形態的二叉樹,滿二叉樹肯定是完全二叉樹,但完全二叉樹不一定是滿二叉樹。
(4)具有n個節點的完全二叉樹的層數(最大層次)為floor(log2(n))+1。【floor()函式向下取整】
二叉搜尋(查詢)樹(binary search tree),也稱有序二叉樹(ordered binary tree)或排序二叉樹(sorted binary tree),它是指一棵空樹或者具有下列性質的二叉樹:
(1)若任意節點的左子樹不空,則它的左子樹上所有節點的元素值均小於該節點的元素值;
(2)若任意節點的右子樹不空,則它的右子樹上所有節點的元素值均大於該節點的元素值;
(3)任意節點的左、右子樹也分別為二叉搜尋樹;
(4)沒有鍵值相等的某2個節點。
二叉搜尋樹的優勢在於查詢、插入的時間複雜度較低,為o(log(n))【n為樹的總節點數】;二叉查詢樹可以用來構建諸如集合、multiset和關聯陣列等。
參考資料
1.《演算法導論》讀書筆記之第10章 基本資料結構之二叉樹
2.**演算法和資料結構(7)
3.輕鬆搞定面試中的二叉樹題目
4.二叉搜尋樹-維基百科
5.資料結構與演算法分析-c語言描述【書籍】
定義和實現二叉樹
1.節點 節點包含乙個資料元素和若干點到其子樹分支 2.度節點 節點的數目已成為節點的子樹 3.葉節點 為0的節點稱為葉結點 4.分支節點 度不為0的節點稱為分支節點 5.樹的度 樹中全部節點的度的最大值 6.二叉樹 是n n 0 個有限節點構成的集合。n 0的樹稱為空二叉樹。n 1的樹僅僅有乙個根...
樹和二叉樹的實現
實驗目的 1 熟練掌握二叉樹的二叉鍊錶表示方法及二叉樹遍歷演算法 2 根據哈夫曼演算法建立哈夫曼樹 涉及的知識點 二叉樹的表示法 二叉樹遍歷演算法的設計 實驗內容 1 設計乙個程式,根據二叉樹的先根序列和中根序列建立一棵用左右指標表示的二叉樹 例如 先根序列為 abdgcef 中根序列為 dgbae...
二叉樹的定義
滿二叉樹 除葉子結點外,所有結點均有兩個子結點。所有葉子結點在同一層。完全二叉樹 若設二叉樹的深度為h,除第 h 層外,其它各層 1 h 1 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹 可以根據公式進行推導,假設n0是度為0的結點總數 即 葉子結點 數 n1是度...