4

我正在尝试将二叉搜索树的内容写入临时数组以便在 main.xml 中使用。但是我不知道该怎么做......我尝试过这样的事情:

void Book::preorder(TreeNode *ptr, Person &temp[], int x)
{

 if(ptr!=NULL)
 {
  temp[x].name=ptr->item.name;
  x++;
  preorder(ptr->left, temp, x);
  preorder(ptr->right, temp, x);
 }

}

并且,它给出了以下错误:

将“temp”a 声明为引用数组

'((Book*)this->Book::temp[x]' 中的 'operator[]' 不匹配

调用 'Book::preorder(TreeNode*&, Person&, int&)' 没有匹配的函数

4

3 回答 3

2

试试这个:

void Book::preorder(TreeNode *ptr, Person temp[], int x)
{

 if(ptr!=NULL)
 {
  temp[x].name=ptr->item.name;
  x++;
  preorder(ptr->left, temp, x);
  preorder(ptr->right, temp, x);
 }

}
于 2010-07-05T01:15:58.013 回答
2
void Book::preorder(TreeNode *ptr, Person temp[])
{
    if(ptr!=NULL)
    {
        temp[globX].name=ptr->item.name;
        temp[globX].phoneNumber=ptr->item.phoneNumber;
        globX++;
        preorder(ptr->left, temp);
        preorder(ptr->right, temp);
    }

}

是我的最终代码。而且我很确定它可以工作......以前的代码有某种逻辑错误。使用全局变量(我知道不推荐)我想通了。

于 2010-07-05T09:11:02.550 回答
1

这可能为时已晚,但我相信,在这里指出是件好事。上述答案在这里提出的建议仅与序列化二叉(搜索)树有关。假设您希望稍后在给定序列化版本的情况下重建树。您必须标记叶子,以便在尝试重新构建树时,清楚哪个节点是另一个节点的子节点。为此,只需在遇到叶节点时向数组(或列表)添加 NULL 引用。然而,当向上一级时,向数组添加另一个 NULL 引用。换句话说,在从每个递归返回之前,只需将 NULL 添加到已传递给方法的数组中。这样,任何向上移动一级都会将 NULL 插入到数组中。重构列表时,将元素添加到堆栈中,同时从数组从左到右读取它们。一旦遇到 NULL 引用,您就 pop() 堆栈中最顶层的对象,并离开堆栈的下一个 peek() 以将其作为其子对象之一指向它。继续到数组中的下一个元素并重复相同的过程。也许有更好的方法来进一步优化这种方法,但这是我最想提到的。希望能帮助到你。

于 2015-05-03T05:51:22.790 回答