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