1. 程式人生 > >試驗總結1 改變遞歸函數中的執行內容

試驗總結1 改變遞歸函數中的執行內容

num pos 都是 there div end tor bintree pri

  在做數據結構慕課《03-樹3 Tree Traversals Again》這道題時,我的思路是先構造好樹,而後直接用PostOrderTraversal(BinTree BT)進行後序遍歷。(這道題目前暫未ac,整體方法有待完善)課上所講的後序遍歷遞歸實現方法是這樣的——

void PostOrderTraversal(BinTree BT)
{
    if(BT){
        PostOrderTraversal(BT->Left);
        PostOrderTraversal(BT->Right);
        printf("%d\n", BT->Data);
    }
}

  不過這樣一來就有問題,題目中有明確的輸出格式要求(“All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.”)。如果是循環方式很容易想到在循環中進行判斷並執行相應操作,可是遞歸函數中每次遞歸都是再進入相同的函數,若是直接在函數中進行標記判斷每次進入該函數時標記變量又會被重置,循環中用到的方法很明顯是不可行的。於是我想到了用全局變量。

  如下所示,在函數外定義好標誌變量count,將PostOrderTraversal(BinTree BT)函數傳入值增加一個標誌位參數,且該函數最後也要返回改變後的count值。需要註意的是這樣一改變之後每次調用該後序遍歷函數時必須變成count = PostOrderTraversal(BT->Left, count); 以實現count數據的傳送更新。

int count = 1int PostOrderTraversal(BinTree BT, int count)
{
    if(BT){
        count = PostOrderTraversal(BT->Left, count);
        count = PostOrderTraversal(BT->Right, count);
        if(count == 1){
            printf("%d", BT->Data);
            count++;
        }
        else
            printf(
" %d", BT->Data); } return count; }

  這樣就實現了第一個數和之後的數輸出格式的不同。

試驗總結1 改變遞歸函數中的執行內容