DS之二叉樹,ds二叉樹

來源:互聯網
上載者:User

DS之二叉樹,ds二叉樹

       二叉樹是另一種樹型結構,它的特點是每個結點至多隻有兩棵子樹(即二叉樹中不存在度大於2的結點),並且,二叉樹的子樹有左右之分,其次序不能任意顛倒。

       二叉樹可以分為5種基本形態:

       (1)空二叉樹。

       (2)僅有根結點的二叉樹。

       (3)左子樹為空白的二叉樹。

       (4)右子樹為空白空的二叉樹。

       (5)左,右子樹均為非空的二叉樹。

       圖示為:

 

       再延伸一下的話就是畫出有三個結點的二叉樹的基本形態:

 

         滿二叉樹

        一棵深度為k且有(2^K)-1個結點的二叉樹稱為滿二叉樹。

        完全二叉樹

        深度為k的,有n個結點的二叉樹,若且唯若其每一個結點都與深度為k的滿二叉樹中編號從1至n的結點一一對應時,稱之為完全二叉樹。

        這兩種特殊形態的二叉樹的圖示:

 

       對於滿二叉樹(a)的深度為4,每一層上的結點數都是最大結點數。對這棵滿二叉樹進行連續編號,約定編號從根結點起,自上而下,自左至右。

      對於完全二叉樹(b)的深度為4,葉子結點只可能在層次最大的兩層上出現,對任一結點,若其右分支下的子孫的最大層為l,則其左分支的子孫的最大層必為l或l+1。

        二叉樹性質:

        (1)在二叉樹的第i層上至多有2^(i-1)(i>=1)個結點。

        (2)深度為k的二叉樹至多有(2^k)-1(k>=1)個結點。

        (3)對任何一棵二叉樹T,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1。

        (4)具有n個結點的完全二叉樹的深度為[log2n]+1,其中[log2n]表示取log2n的整數部分。

        (5)如果對一棵有n個結點的完全二叉樹(其深度為[log2n]+1)的結點按層序編號(從第1層到第[log2n]+1層,每層從左至右),則對任一結點i(1<=i<=n),有:

        1如果i=1,則結點i是完全二叉樹的根,無雙親;如果i>1,則其雙親PARENT(i)是結點[i/2]。

        2如果2i>n,則結點i無左孩子(結點i為葉子結點);否則其左孩子LCHILD(i)是結點2i。

        3如果2i+1>n,則結點i無右孩子;否則其右孩子RCHILD(i)是結點2i+1。

        二叉樹的儲存結構

        順序儲存結構

        按照順序儲存結構的定義,在此約定,用一組地址連續的儲存單元一次自上而下,自左至右儲存完全二叉樹的結點元素,即將完全二叉樹編號為i的結點元素儲存在如上定義的一維數組中下標為i-1的分量中。

        順序儲存結構表示:

<span style="font-size:18px;">#define MAX_TREE_SIZE 100typedef char TElemtype;TElemtype SqBiTree[MAX_TREE_SIZE];</span>

        對於上面的滿二叉樹和完全二叉樹的順序儲存結構為:

 

       對於一般的二叉樹的順序儲存結構表示需要用到“空”的結點。

 

       對於上面的一般二叉樹的順序儲存數字0或字元^代表的是空結點。在最壞的情況下,一個深度為k且只有k個結點的單支樹(樹中不存在度為2的結點)需要長度為(2^k)-1的一維數組。

       鏈式儲存結構

       由二叉樹的定義可知,二叉樹的結點是由一個資料元素和分別指向其左,右子樹的兩個分支構成,因此表示二叉樹的鏈式儲存中的結點至少包含3個域:資料域,左,右指標域。最常用的就是二叉樹的二叉鏈表格儲存體結構。

 

二叉鏈表的結點結構

 

 二叉鏈表

        為了方便訪問某結點的雙親,還可以給鏈表結點增加一個雙親欄位parent,用來指向其雙親結點。每個結點由四個域組成,其結點結構為:

 

          這種儲存結構既便於尋找孩子結點,又便於尋找雙親結點;但是,相對於二叉鏈表格儲存體結構而言,它增加了空間開銷。利用這樣的結點結構表示的二叉樹的鏈式儲存結構被稱為三叉鏈表。

 

       還是來看最常用的二叉樹的二叉鏈表格儲存體表示:

<span style="font-size:18px;">typedef struct BiTNode//重新定義二叉樹的二叉鏈表的結構{   TElemType   data;   struct  BiTNode   *lchild,*rchild; //左右孩子指標}BiTNode,*BiTree;</span>

        二叉鏈表的基本操作:

<span style="font-size:18px;">Status createBiTree(BiTree &T)按先序次序輸入二叉樹額結點的值(一個字元),#字元表示Null 字元構造二叉鏈表表示的二叉樹TStatus PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e))採用二叉鏈表格儲存體結構,Visit是對結點操作的應用函數先序遍曆二叉樹T,對每個結點調用Visit一次且僅一次一旦Visit()操作失敗,則操作失敗Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e))採用二叉鏈表格儲存體結構,Visit是對結點操作的應用函數中序遍曆二叉樹T,對每個結點調用Visit一次且僅一次一旦Visit()操作失敗,則操作失敗Status PostOrderTraverse(BiTree T,Status(*Visit)(TElemType e))採用二叉鏈表格儲存體結構,Visit是對結點操作的應用函數後序遍曆二叉樹T,對每個結點調用Visit一次且僅一次一旦Visit()操作失敗,則操作失敗Status LeveleOrderTraverse(BiTree T,Status(*Visit)(TElemType e))採用二叉鏈表格儲存體結構,Visit是對結點操作的應用函數層序遍曆二叉樹T,對每個結點調用Visit一次且僅一次一旦Visit()操作失敗,則操作失敗</span>

      

 

 

 

 

 

       

 

   

 

 

 

 

        

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.