问题分析:
假设一个
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
豪 阅读(1187)
评论(9) 编辑 收藏 引用 所属分类:
C++之梦