第五章 二叉樹、樹和森林


 

1.二叉樹、樹和森林的定義

  (1)樹的定義:樹是n(n>=0)個結點的有限集。當n=0時,稱為空樹,任何一棵樹都應滿足:

      ①有且僅有一個特定的稱為根的結點。

      ②當n>1時,其余節點可分為m(m>0)個互不相交的有限集T1,T2,...,Tm,其中每個集合本身又是一棵樹,並且稱為根的子樹。

  (2)二叉樹的定義:二叉樹是每個結點最多只有兩顆子樹,並且二叉樹的子樹有左右之分,其次序不能顛倒。

  (3)森林(forest)的定義:森林是m(m≥0)棵互不相交的樹的集合。任何一棵樹,刪除了根結點就變成了森林。

  (4)二叉樹和度為2的樹的區別:

    ①度為2的樹至少有3個結點,而二叉樹可以為空。

    ②度為2的有序樹的孩子的左右次序是相對於另一個海西而言的,若某個結點只有一個孩子,則這個孩子沒有左右次序之分;而二叉樹無論孩子數是否為2,都有左右次序之分。

  (5)樹有關常用的公式:

    ①結點數 = 所有結點的度數 + 1

    ②度為m的樹中第i層上至多有m(i-1) 個結點

    ③高度為h的m叉樹至多有 (mh-1)/(m-1)個結點

    ④具有n個結點的m叉樹的最小高度為logm(n(m-1)+1)

    ⑤高度為h的滿二叉樹的結點數:2h-1 

    ⑥二叉樹中n0 = n2 + 1

    ⑦非空二叉樹第k層上至多有2k-1個結點

    ⑧具有n個結點的完全二叉樹的高度為log2(n+1)

2.二叉樹的實現(包括順序存儲結構和鏈式存儲結構)、二叉樹的遍歷

  (1)二叉樹的順序存儲結構:

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

   (2)二叉樹的鏈式存儲結構(n個結點的二叉樹,有n+1個空鏈域)

    用鏈表結點來存儲二叉樹中的每個結點。在二叉樹中,結點結構通常包含若干數據域和若干指針域,二叉鏈表至少包含3個域:數據域data,左指針域lchild,有指針域rchild。

 

   結構體定義:

1 typedef struct BiTree{
2     ElemType data;
3     struct BiTNode *lchild,*rchild;
4 }BiTNode,*BiTree;

  (3)二叉樹的遍歷

    ①先序遍歷(NLR)

1 void PreOrder(BiTree T){
2     if(T!=NULL){
3         visit(T);
4         PreOrder(T->lchild);
5         PreOrder(T->rchild);
6     }
7 } 

    ②中序遍歷(LNR)

1 void InOrder(BiTree T){
2     if(T!=NULL){
3         PreOrder(T->lchild);
4         visit(T);
5         PreOrder(T->rchild);
6     }
7 } 

    ③后序遍歷(LRN)

1 void PostOrder(BiTree T){
2     if(T!=NULL){
3         PreOrder(T->lchild);
4         PreOrder(T->rchild);
5         visit(T);
6     }
7 } 

    ④層序遍歷(依靠隊列)

 1 void LevelOrder(BiTree T){
 2     InitQueue(Q);
 3     BiTree p;
 4     EnQueue(Q,T);
 5     while(!IsEmpty(Q)){
 6         DeQueue(Q,p);                //出隊列,進行遍歷 
 7         visit(p);
 8         if(p->lchild != NULL){        //左子樹不為空,進隊列 
 9             EnQueue(Q,p->lchild);
10         }
11         if(p->rchild != NULL){        //右子樹不為空,進隊列 
12             EnQueue(Q,p->rchild);
13         }    
14     }
15 } 

     ⑤非遞歸先序遍歷

 

 1 void PreOrder(BiTree T){
 2     InitStack(S);
 3     BiTree p = T;
 4     while(p || !isEmpty(S)){
 5         if(p){
 6             visit(p);
 7             Push(S,p);
 8             p = p->lchild;
 9         }else{
10             Pop(S,p);
11             p = p->rchild;
12         }
13     }
14 } 

 

 

 

3.二叉樹結構下的應用及擴展,例如二叉檢索樹、2-3-4樹、Huffman編碼以及堆;

  (1)二叉檢索樹(BST)(詳見第七章)

    中序遍歷為有序遞增序列

  (2)2-3-4樹

    2-3-4樹每個節點最多有四個子節點和三個數據項,名字中 2,3,4 的數字含義是指一個節點可能含有的子節點的個數。對於非葉節點有三種可能的情況:

      ①、有一個數據項的節點總是有兩個子節點;

      ②、有二個數據項的節點總是有三個子節點;

      ③、有三個數據項的節點總是有四個子節點;

    簡而言之,非葉節點的子節點數總是比它含有的數據項多1。如果子節點個數為L,數據項個數為D,那么:L = D + 1

 

    葉節點(上圖最下面的一排)是沒有子節點的,然而它可能含有一個、兩個或三個數據項。空節點是不會存在的。

     樹結構中很重要的一點就是節點之間關鍵字值大小的關系。在二叉樹中,所有關鍵字值比某個節點值小的節點都在這個節點左子節點為根的子樹上;所有關鍵字值比某個節點值大的節點都在這個節點右子節點為根的子樹上。2-3-4 樹規則也是一樣。

    重點:節點插入和刪除,涉及到新建節點和節點分裂。

  (3)Huffman編碼

    定義:在含有n個帶權葉結點的二叉樹中,其中帶權路徑長度(WPL)最小的二叉樹稱為哈夫曼樹,也稱為最優二叉樹。

    構造過程:每次選取最小的兩個結點,構成一個子樹。重復此過程,知道建立一棵完整的數。

    哈夫曼編碼:構造出哈夫曼樹之后,左0右1進行編碼,然后每個結點都有唯一編碼。

      特點:沒有一個編碼是另一個編碼的前綴,則稱這樣的編碼為前綴編碼。

    帶權路徑長度(WPL) = ∑(權值*路徑長度)

  (4)堆(詳見第八章堆排序)

    大根堆與小根堆。

 

4.平衡二叉樹的定義、平衡因子的定義以及平衡二叉樹的旋轉操作;

  (1)平衡二叉樹的定義:為避免樹的高度增長過快,降低二叉排序樹的性能,規定在插入和刪除結點時,要保證任意結點的左、右子樹高度差的絕對值不超過1,將這樣的二叉樹稱為二叉平衡樹。

  (2)平衡因子的定義:定義結點左子樹和右子樹的高度差為該結點的平衡因子。

  (3)平衡二叉樹的旋轉操作

    ①LL平衡旋轉(右單旋轉)

    ②RR平衡旋轉(左單旋轉)

    ③LR平衡旋轉(先左后右雙旋轉)

    ④RL平衡旋轉(先右后左雙旋轉)

   平衡二叉樹nh表示深度為h的平衡樹中含有的最少結點數,nh = nh-1 + nh-2 +1。 n0=0, n1=1, n2=2

5.樹和森林的存儲結構、樹和森林的遍歷以及森林與二叉樹的轉換;

  (1)樹的存儲結構

    ①雙親表示法

      采用一組連續空間來存儲每個結點,同時在每個結點中增設一個偽指針,指示其雙親結點在數組中的位置。

      

 

    優點:可以很快找到雙親結點

    缺點:求結點的孩子結點需要遍歷整個結構

    ②孩子表示法

      孩子表示法將每個結點的孩子結點用單鏈表鏈接起來形成一個線性結構,此時n個結點就有n個孩子鏈表。

     特點:尋找子女結點非常遍歷,查找父母結點需要遍歷整個結構。

 

     ③孩子兄弟表示法

     優點:存儲比較靈活,最大的優點是可以方便地實現樹轉換為二叉樹的操作,易於查找結點的孩子等。

     缺點:從當前結點查找其雙親結點比較麻煩。

   (2)樹和森林的遍歷

    ①樹的遍歷

      先根遍歷:其遍歷序列與這棵樹相應二叉樹的先序序列相同。

      后根遍歷:其遍歷序列與這棵樹相應二叉樹的中序序列相同。

    ②森林的遍歷

      先序遍歷森林:

        (1)訪問森林中第一棵樹的根結點。

        (2)先序遍歷第一棵樹中根結點的子樹森林。

        (3)先序遍歷除去第一棵樹之后剩余的樹構成的森林。

      中序遍歷森林:

        (1)中序遍歷森林中第一棵樹的根結點的子樹森林。

        (2)訪問第一棵樹的根結點。

        (3)中序遍歷除去第一棵樹之后剩余的樹構成的森林。

  (3)森林和二叉樹的轉換

    樹轉換二叉樹的規則:做孩子右兄弟。

 

6.並查集抽象數據類型的定義以及實現

  並查集的意義,以及掌握並查集的基本操作的實現。

   待學習整理!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM