我正在写一个表达式树。
Node类的实例是left,right和parent成员。
感谢James McNellis中的this post,我宣称它们是指针。
class Node
{
public:
char *cargo;
int depth;
Node *parent;
Node *left;
Node *right;
//constructors/destructor:
Node(void);
Node(int a_depth, Node *pparent = __nullptr);
~Node();
//method:
void traverse_tree(Node n)
};
现在我尝试遍历树并将其打印出来(发送到“out”)。
递归调用'traverse_tree(left);'和'traverse_tree(右);'
导致错误消息“无法将参数1从'Node *'转换为'Node'”。
最初调用Traverse_tree,并将根节点作为争论。
我认为参数“(Node n)”的声明让编译器感到困惑,而且它不知道
是否要调用构造函数。
如何将“left”和“right”传递给“traverse_tree”方法?
void Node::traverse_tree(Node n)
//utility to view the tree
{
if (((left) == __nullptr)||((right) == __nullptr))
{
return;
}
traverse_tree(right);
out<<' '<<n.cargo<<"\n";
traverse_tree(left);
return;
};
答案 0 :(得分:3)
取消引用你的指针:
traverse_tree(*right);
您可能还想更改traverse_tree
方法以接受参考:
void traverse_tree(Node &n)
答案 1 :(得分:2)
我认为您应该使用节点指针调用traverse_tree
,而不是节点。您通常使用指针进行此类操作。这将导致类似:
void Node::traverse_tree (Node *n) {
if ((left == __nullptr) || (right == __nullptr))
return;
traverse_tree (right);
out << " " << n.cargo << "\n";
traverse_tree (left);
return;
};
你可以用:
来称呼它root.traverse_tree (&root);
您可能希望在某些时候重新设计代码以使其更像C ++ - 如:
void Node::traverse_tree(void) {
if ((left == __nullptr) || (right == __nullptr))
return;
right->traverse_tree();
out << " " << cargo << "\n";
left->traverse_tree();
return;
};
换句话说,遍历使用子节点本身的方法而不是传递指针(这实际上是“老派”非面向对象的处理方式)。