【发布时间】:2020-06-18 20:30:29
【问题描述】:
所以,不久前我开始学习和阅读 OOP,我一直在使用类和对象来实现我所知道的所有数据结构,只是为了整体练习并熟悉在 c++ 中使用 OOP。
我正在实现树数据结构,我一直想知道如何递归调用一个方法(我知道我必须传入一个参数),这样当我在 main 中创建一个对象并调用一个特定的方法写成如下a.inorder(); 而不是a.inorder(root),因为root 是私有属性。
这可能吗?
我的代码:
#include<iostream>
using namespace std;
struct node
{
int data;
node* left;
node* right;
};
class tree
{
private:
node* root;
public:
tree();
tree(int val);
void insert(int val);
void preorder();
void postorder();
void inorder();
int count();
};
tree::tree() : root { NULL }
{
}
tree::tree(int val)
{
root = new node;
root->data = val;
root->left = root->right = NULL;
}
void tree::insert(int val)
{
if (!root)
{
root = new node;
root->data = val;
root->left = root->right = NULL;
}
else
{
node* t = root;
node* p = NULL;
while (t)
{
p = t;
if (val > root->data)
t = root->right;
else
t = root->left;
}
t = new node;
t->data = val;
t->left = t->right = NULL;
if (p->data > t->data)
p->left = t;
else
p->right = t;
}
}
void tree::preorder()
{
if (root)
{
}
}
【问题讨论】:
-
⟼请记住,尤其是在 Stack Overflow 上学习和提问时,尽可能让代码保持井井有条是很重要的。 Consistent indentation 有助于传达结构,更重要的是,有助于传达意图,这有助于我们快速找到问题的根源,而无需花费大量时间尝试解码正在发生的事情。
-
如果一个类有一个像
root这样的属性,那么将它传递给一个函数是多余的,这个类已经知道它是什么了。对于递归,您始终可以使用单独的protected方法进行挖掘,然后根据需要使用它。 -
indirection 是你的朋友...从该方法调用另一个执行递归的 [private] 方法
-
“我知道我必须传入一个参数” - 在一个类中,每个(非静态)方法属性都会自动传递一个“this”指针。在某些递归工作中,隐藏指针就足够了。