問題分析:
假設一個
struct TreeNode
{
int tData;
TreeNode *lp, *rp;//左右兒子的指針
};
規定用遞歸前序遍歷以pNode為根二叉樹,把節點指針保存在rs數組中,并返回節點個數cnt.
因為要用遞歸遍歷, 所以cnt必須保留遞歸每層cnt的值.
實現方法有兩種:
1:用by value傳值,cnt初值為0;
int travel(TreeNode *pNode, TreeNode **rs, int &cnt)
{
if (pNode == NULL)
{
return cnt;
}
rs[cnt++] = pNode;
travel(pNode->lp, rs, cnt);
travel(pNode->rp, rs, cnt);
return cnt;
}
2:用靜態變量實現
int travel(TreeNode *pNode, TreeNode **rs)
{
static int cnt = 0;
if (pNode == NULL)
{
return cnt;
}
rs[cnt++] = pNode;
travel(pNode->lp, rs, cnt);
travel(pNode->rp, rs, cnt);
return cnt;
}
對比1和2,顯然2的函數要比1的來得友好,因為在1中增加的參數cnt不屬于函數接口,只是為了函數的實現而引入的,所以參數cnt的出現,破壞了接口的友好性.但是如果用2的方法,在函數再次使用的時候static int cnt的值仍保持上次函數被調用時的值,而沒有初始化為0,從而達不到函數再次被調用的目的.那有沒有好的解決方法呢?
我們利用函數重載,重載travel函數,并在此函數內調用1的travel函數.
int travel(TreeNode *pNode, TreeNode **rs)
{
int cnt = 0;
return travel(TreeNode *pNode, TreeNode **rs, int &cnt);
}
這樣的話,就能很好的解決了函數接口的友好性,而又不會出現static變量的副作用了.
以上是小弟的一點愚見.
posted on 2006-03-14 13:11
豪 閱讀(1197)
評論(9) 編輯 收藏 引用 所屬分類:
C++之夢