Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 从二叉树的递归遍历想到的:利用重载函数,使函数接口更"友好"
【标  题】:从二叉树的递归遍历想到的:利用重载函数,使函数接口更"友好"
【关键字】:
【来  源】:http://www.cppblog.com/qywyh/archive/2006/03/14/4132.html

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

Your Ad Here

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


以上是小弟的一点愚见.

高级进程通信技术------IPC通信:【上一篇】
Enums and Structs in C#:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 滑动的效果(支持各种的浏览器)
  • 控制访问oracle的ip
  • 如何保证开发过程中对数据库结构的更新顺利地迁移到产品服务器上。
  • “马的遍历”问题的贪婪法解决算法
  • 数据库程序的精简安装
  • 国家计算机二级考试程序修改与设计(1)
  • 用javascript屏蔽功能键
  • 医药龙头扬子江选择ERP的选型过程
  • 利用吹光纤技术综合布线
  • 轩辕剑4 沧之涛练功秘籍
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.