从二叉树的递归遍历想到的:利用重载函数,使函数接口更"友好"

从二叉树的递归遍历想到的:利用重载函数,使函数接口更"友好"

问题分析:
假设一个
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变量的副作用了.


以上是小弟的一点愚见.

你可能感兴趣的:(从二叉树的递归遍历想到的:利用重载函数,使函数接口更"友好")