首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-01-21 
类的成员函数可不可以是递归函数?好纠结比如我要写一个二叉树的类遍历二叉树 第一个处理根结点,后处理孩子

类的成员函数可不可以是递归函数?好纠结
比如我要写一个二叉树的类
遍历二叉树 第一个处理根结点,后处理孩子结点 。如果用递归的话,必须传入指针,第一次传入的是指向根结点的指针,以后传入的是指向孩子结点的指针。不好递归啊
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<<')';
}
}

可是如果类中有很多递归成员函数的话,每个递归都要写两个函数,就很麻烦了。而且每个递归都两个函数,用户在调用的时候且不容易弄混淆
[解决办法]
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()) 不就行了吗?
[解决办法]
是我没明白你的意思,还是你没明白我的意思呢?

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


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

    void Print(const T *p)……

[解决办法]
引用:
引用:
当然可以的。

你说什么可以?


当然可以递归了 
对于你的这个具体的例子 要是我写的话 我就写成
void BiTree::Print(pBiTNode p=NULL)
如果不传参数或者是NULL的时候 就是遍历整个树。
[解决办法]
引用:
这是一个解决方法。但是这样,就是希望用户用的时候应该认为这是一个无参数函数,可是VC6.0的自动提示会告诉它这个函数有参数,不过这个参数有默认值NULL


引用:
引用:
引用:
当然可以的。

你说什么可以?


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


你看一下MFC的CTREECTRL这个类 里面定义了一些宏 对于操作树结构比较方便
[解决办法]
可以递归

热点排行