1. 程式人生 > >{資料結構}計算二叉樹中葉子結點個數

{資料結構}計算二叉樹中葉子結點個數

 /**************************************************

演算法描述:編寫遞迴演算法,計算二叉樹中葉子節點數目(6.42)  ****************************************************/ int leaf(bitree t) {   if(!t)           return 0;      //空樹,無葉子    else if(!t->lch && !t->rch)            return 1;         else             return (leaf(t->lch) + leaf(t->rch)); } /************************ 演算法分析: 首先要明白其本質還是二叉樹的遍歷.只不過是帶額外有條件的輸出.即找出葉子結點並 進行計數. 1.提到計數的話,一開始的反應就是建立一個int型變數(如count),然後找到一個符合條件 的就進行count ++; 但在這裡就不是那麼合適了.因為若是要遍歷,選擇遞迴遍歷,則每次 呼叫一次遞迴函式都會建立一個count,各個count都不相同.而且都會被初始化為0,這樣就 沒什麼意義了. 2.所以採取的方法就是利用函式返回值.把函式定義為返回值為int型的函式. 3.然後進行判斷: if(!t->lch && !t->rch)如果左右結點都為NULL,則返回1(也就是計數+1). 否則就呼叫遞迴函式,先左子樹,後右子樹.這個演算法真正精髓的一句就是: return (leaf(t->lch) + leaf(t->rch)); 在呼叫遞迴的同時把各個遞迴函式的返回值都加了起來.而最終返回到主函式的值 就是葉子節點的個數!巧妙!:D  **************************/