这个递归void函数有问题:
void ReadBinaryTree(NODE &p)
{
char ch;
File.get(ch);
if (ch != '#')
{
NODE p = new Node;
p->SetFreq(ch);
ReadBinaryTree(p->Left());
ReadBinaryTree(p->Right());
}
else return;
}
NODE
是指向Node类的指针,File是ifstream对象。
Left()
和Right()
返回NODE
。
编译器不接受p->Left()
和p->Right()
参数,错误是:
no know conversion for argument 1 from 'NODE {aka Node*} to 'Node *&
你可以帮帮我吗?如何在递归期间保存指向Node的指针?
答案 0 :(得分:2)
设为Left
和Right
返回引用。您正在尝试将临时值传递给ReadBinaryTree
,不要绑定到参数列表中的非const
引用。
你的递归总是被打破,因为你在函数内部运行的是本地NODE p
,而不是参数。也许你的意思是p = new Node;
,虽然这很难说清楚。
答案 1 :(得分:0)
问题是p->Left()
和p->Right()
是 r-values ,这意味着您无法引用它们。问题出现是因为p->Left()
正在返回一些值(类型为Node *
),而这些值正被复制到ReadBinaryTree
的参数中。
要解决此问题,您的p->Left()
和p->Right()
函数应返回NODE &
个值(这样您的递归可以访问与父节点中完全相同的指针,而不仅仅是一些副本)。
此外,NODE p = new Node;
应为p = new Node;
。
但是,我可以建议您将此函数转换为返回值的函数吗?即。
NODE ReadBinaryTree(ifstream &File)
{
char ch; File.get(ch);
if(ch != '#')
{
NODE p = new Node;
p->setFreq(ch);
p->Left() = ReadBinaryTree(File);
p->Right() = ReadBinaryTree(File);
return p;
} else return null;
}
此代码仍需要左右访问者才能返回引用。
编辑:解释为什么参考不能采用r值
p->Left()
(访问者函数)返回左指针的副本。因此,虽然该值与p->left
(属性)相同,但内存中的位置不同,重要的是,p->Left()
已被分配了一个临时内存位置,因为它是一个表达式,它是期望变量“投入”。通常,当您将表达式传递给函数时,它会被“放入”传入的参数,如但,如果该参数是引用,它期望已经是非临时的内存位置,它采用自己的方式。因此,当您将表达式(具有临时内存位置)传递给期望引用的内容时,它会抱怨,因为它期望具有已经固定的内存位置的内容,以便采用它。
答案 2 :(得分:0)
ReadBinaryTree
需要对指针的引用,以便它可以更新指针以指向新创建的对象。问题是Left()
和Right()
只返回子节点的地址,而不是对存储地址的指针的引用。
因此,您可以更改Left()
和Right()
的签名:
NODE Left()
为:
NODE & Left()
作为替代方案,您可以直接将存储子节点的指针传递给ReadBinaryTree
:
ReadBinaryTree (p->left)
(这自然假设Node
中有一名成员left
)