2010-07-05 60 views
4

我正在尝试将二叉搜索树的内容写入临时数组以便在main中使用。但是我不知道该怎么办呢?我已经试过这样的事情:BST预序遍历并将树内容写入临时数组

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作为参考的数组

没有匹配关于 '操作符[]' 中 '((图书*)这 - >书::温度[X]'

为调用“书::序没有匹配函数(树节点* &,人&, INT &)”

+0

你可以显示你使用的代码吗? – slf 2010-07-05 01:10:52

+0

我还没有尝试过调用此方法。 – 2010-07-05 01:12:00

回答

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); 
    } 

} 

是我的最终代码。我很确定它的工作原理......以前的代码有某种逻辑错误。使用全局变量(我知道这不是建议)我明白了。

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); 
} 

} 
+0

嗯..没有必要使用数组传递,然后呢? – 2010-07-05 01:22:43

+1

不会。您正在做的方式是传递“参考数组”而不是“数组参考”。但是数组不需要引用,因为它们是指针。 – CrociDB 2010-07-05 01:26:26

+0

它工作。但我不确定它是否提供列表的预先遍历。 – 2010-07-05 01:35:16

1

这或许为时已晚,但我相信在这里指出很好。前面提到的答案仅仅涉及序列化二进制(搜索)树。想象一下,如果您希望在序列化的版本中重新构建树,您必须标记叶子,以便在您尝试重新构建树时清楚哪个节点是另一个节点的子节点。要实现这一点,只需在遇到叶节点时将空引用添加到数组(或列表)中即可。然而,当向上一层时,向数组添加另一个NULL引用。换句话说,在从每次递归返回之前,只需将NULL传递给已传入方法的数组。这样,任何向上移动都会产生一个NULL插入到数组中。在重建列表时,将元素添加到堆栈中,当您从阵列中从左向右阅读它们时。一旦击中NULL引用,就会弹出堆栈中最顶层的对象,并将堆栈的下一个peek()指向它的一个子节点。继续到数组中的下一个元素并重复相同的过程。也许有更好的方法可以进一步优化这种方法,但这是我头上提到的。希望能帮助到你。