1. 程式人生 > >3、非線性結構--樹與二叉樹——數據結構【基礎篇】

3、非線性結構--樹與二叉樹——數據結構【基礎篇】

位置 enter 深度 基礎 表達式 左右 -a 基礎篇 先序遍歷

非線性結構--樹與二叉樹

二叉樹的基礎知識:

        二叉樹的特點:

            1、每個結點的度<=2

            2、二叉樹是有序樹


        二叉樹的五種不同的形態:

            1、空樹

            2、一個根結點的根樹

            3、左子樹

            4、右子樹

            5、左右並存的二叉樹

        二叉樹的性質:

            性質1:二叉樹第i層上的結點數目最多為 2{i-1} (i≥1)

            性質2:深度為k的二叉樹至多有2{k}-1

個結點(k≥1)

            性質3:包含n個結點的二叉樹的高度至少為log2 (n+1)

            性質4:在任意一棵二叉樹中,若終端結點的個數為n0,度為2的結點數為n2,則n0=n2+1

二叉樹的存儲結構:

       順序存儲結構:

             1、連續

            2、編號法

            3、一般的二叉樹這樣存儲會造成大量的空間的浪費

       鏈式存儲結構:

二叉樹的遍歷形式:

           1、按層遍歷——從上到下,從左到右依次訪問每個結點

           2、中序遍歷 (中綴表達式)——先訪問左子樹,再訪問根結點,最後訪問右子樹

           3、先序遍歷 (前綴表達式)——先訪問根結點,再訪問左子樹,最後訪問右子樹

           4、後序遍歷 (後綴表達式)——先訪問右子樹,再訪問左子樹,最後訪問根結點

二叉樹的一些特點:

           1、如何可唯一地確定一棵二叉樹

              先序+中序或後序+中序均可唯一地確定一棵二叉樹

              先序序列找根

              中序序列找位置

           2、二叉樹的二叉鏈表存儲結構中,有多少個指針域未利用

              二叉樹的二叉鏈表存儲結構中,有n+1個指針域未利用,已經使用的有n-1個指針域,共有2n個指針域

線索二叉樹:

       實質:對一個非線性結構進行結構化操作,是每個結點(除第一和最後一個外)在這些線性序列中有且有一個前驅結點和後繼結點

          線索二叉樹尋找某個結點的前驅結點或者後繼結點的操作前提是之前指定了某一個遍歷的順序

哈夫曼樹:
       1、路徑長度:兩個結點之間的路徑長度是連接兩結點的路徑上的分支數

       2、樹的路徑長度:是各結點到根結點的路徑長度之和

       3、帶權路徑長度達到最小的二叉樹——最優二叉樹

       4、在哈夫曼樹中,權值大的結點立根最近

       5、哈夫曼編碼——實現數據壓縮

            哈夫曼編碼是一種無前綴的編碼

       6、哈夫曼樹的構造

            1)將一組數據按從小到大進行排序
            2)拿出最小的兩個數據進行合並,將得到的和的結果最後重新與剩下的數據按照從小到大的順序進行排序
            3)繼續2的操作
            4)直至森林中只有一棵樹

            註意:哈夫曼編碼時,左子樹標註為0,右子樹標註為1

            註意:在構造哈夫曼樹時,權值小的放到左子樹,權值大的放到右子樹

樹和森林:

       1、樹的雙親表示——根沒有雙親一般置為-1,根的指針編號為0

       2、樹的孩子表示

     3、樹的雙親孩子表示

       4、孩子兄弟表示

樹、森林和二叉樹的轉換:

       1、樹轉換成二叉樹:

          連線:將相鄰兄弟之間連線

          抹線:抹掉雙親與除左孩子外其它孩子之間的連線

          旋轉:只需將樹作適當的旋轉

          垂直方向或垂直偏左的作其左子樹,水平方向的作其右子樹

       2、森林轉換成二叉樹:

          1)將森林中每一棵樹分別轉換成二叉樹

          2)合並:使得第n棵樹接入到第n-1棵的右邊並成為他的右子樹,依次下去,最後直至剩下一棵二叉樹

       3、二叉樹還原成樹或森林:

          1)右鏈斷開

            將二叉樹的根結點的右鏈及右鏈的右鏈等全部斷開,得到許多棵無右子樹的二叉樹

          2)將1)中得到的每一棵二叉樹都還原成樹

樹和森林的遍歷:

       樹和森林只有先序遍歷和後序遍歷

       1)樹的先序遍歷

       如果樹非空,則先訪問根結點,然後依次先序遍歷各子樹

       2)森林的先序遍歷

       如果森林非空,則先訪問森林中第一棵樹的根結點,再先序遍歷第一棵樹各子樹,再先序遍歷第二棵樹......直至最後一棵樹

       註意:樹和森林的先序遍歷等價於它轉換成的二叉樹的先序遍歷,樹和森林的後序遍歷等價於它轉換成的二叉樹的中序遍歷

3、非線性結構--樹與二叉樹——數據結構【基礎篇】