类的成员函数可不可以是递归函数?好纠结

善良超锅锅 2011-11-26 07:39:06
比如我要写一个二叉树的类
遍历二叉树 第一个处理根结点,后处理孩子结点 。如果用递归的话,必须传入指针,第一次传入的是指向根结点的指针,以后传入的是指向孩子结点的指针。不好递归啊
void BiTree::PrintBiTree()
{
pBiTNode p=root; //第一个根结点不好传入,我只能为它另写一个函数了
if(p)Print(p);
}
void BiTree::Print(pBiTNode p) //如果没有上面那个函数,第一次就要传入root指针,而root是类的成员
{ //对用户是不可见的。
if(p!=NULL)cout<<p->data;
if(p->lchild!=NULL||p->rchild!=NULL)
{
cout<<'(';
Print(p->lchild);
cout<<',';
Print(p->rchild);
cout<<')';
}
}

可是如果类中有很多递归成员函数的话,每个递归都要写两个函数,就很麻烦了。而且每个递归都两个函数,用户在调用的时候且不容易弄混淆
...全文
1096 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kdzhangbin123 2013-01-07
  • 打赏
  • 举报
回复 1
和楼主遇到了同样的问题。楼主可以这样递归啊。 void BiTree::Print() { if(p!=NULL)cout<<p->data; if(this != NULL) { root->left->Print(); root->right->Print(); } }
一叶之舟 2011-11-29
  • 打赏
  • 举报
回复
可以递归
善良超锅锅 2011-11-29
  • 打赏
  • 举报
回复
问题怎么解决
善良超锅锅 2011-11-27
  • 打赏
  • 举报
回复
这是一个解决方法。但是这样,就是希望用户用的时候应该认为这是一个无参数函数,可是VC6.0的自动提示会告诉它这个函数有参数,不过这个参数有默认值NULL

[Quote=引用 6 楼 caozl 的回复:]
引用 4 楼 shimachao 的回复:
引用 3 楼 yujie_v 的回复:
当然可以的。

你说什么可以?


当然可以递归了
对于你的这个具体的例子 要是我写的话 我就写成
void BiTree::Print(pBiTNode p=NULL)
如果不传参数或者是NULL的时候 就是遍历整个树。
[/Quote]
caozl 2011-11-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shimachao 的回复:]
引用 3 楼 yujie_v 的回复:
当然可以的。

你说什么可以?
[/Quote]

当然可以递归了
对于你的这个具体的例子 要是我写的话 我就写成
void BiTree::Print(pBiTNode p=NULL)
如果不传参数或者是NULL的时候 就是遍历整个树。
善良超锅锅 2011-11-27
  • 打赏
  • 举报
回复
果断无人回帖?????????
caozl 2011-11-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shimachao 的回复:]
这是一个解决方法。但是这样,就是希望用户用的时候应该认为这是一个无参数函数,可是VC6.0的自动提示会告诉它这个函数有参数,不过这个参数有默认值NULL


引用 6 楼 caozl 的回复:
引用 4 楼 shimachao 的回复:
引用 3 楼 yujie_v 的回复:
当然可以的。

你说什么可以?


当然可以递归了
对于你的这个具体的例子 要是我写的话 我就写成……
[/Quote]

你看一下MFC的CTREECTRL这个类 里面定义了一些宏 对于操作树结构比较方便
善良超锅锅 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yujie_v 的回复:]
当然可以的。
[/Quote]
你说什么可以?
yujie_v 2011-11-26
  • 打赏
  • 举报
回复
当然可以的。
chaoplusplus 2011-11-26
  • 打赏
  • 举报
回复
是我没明白你的意思,还是你没明白我的意思呢?
[Quote=引用 1 楼 ghostplant 的回复:]

root变量的确是成员,而且一般设成私有变量,你可以定义一个共有函数返回该变量啊:


class AAA {
private:
T root;
public:
const T &getRoot() const { // 保护root不被修改
return root;
}

void Print(const T *p)……
[/Quote]
ghostplant 2011-11-26
  • 打赏
  • 举报
回复
root变量的确是成员,而且一般设成私有变量,你可以定义一个共有函数返回该变量啊:


class AAA {
private:
T root;
public:
const T &getRoot() const { // 保护root不被修改
return root;
}

void Print(const T *p) { // 类的递归函数
if (..)
Print(p->left),...,Print(p->right);
}
}

然后调用 AAA::Print(&AAA::getRoot()) 不就行了吗?

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧