4

メインで使用するために、二分探索木のコンテンツを一時配列に書き込もうとしています。ただし、どうすればよいかわかりません...次のようなことを試しました:

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[])
{
    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 に答える
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 に答える
1

これはおそらく手遅れですが、ここで指摘するのは良いことだと思います。ここで前述の回答が示唆しているのは、バイナリ (検索) ツリーのシリアル化のみに関連しています。シリアル化されたバージョンを指定して、後でツリーを再構築したいとします。ツリーを再構築しようとしたときに、どのノードが別のノードの子であるかが明確になるように、葉をマークアップする必要があります。これを実現するには、リーフ ノードに遭遇したときに配列 (またはリスト) に NULL 参照を追加するだけです。ただし、1 レベル上に行くときは、さらに別の NULL 参照を配列に追加します。つまり、各再帰から戻る前に、メソッドに渡された配列に NULL を追加するだけです。このように、1 レベル上に移動すると、配列に NULL が挿入されます。リストを再構築するときは、配列から要素を左から右に読み取るときに要素をスタックに追加します。NULL 参照にヒットしたら、スタックから最上位のオブジェクトを pop() し、スタックの次の peek() を残して、そのオブジェクトをその子の 1 つとしてポイントします。配列内の次の要素に進み、同じ手順を繰り返します。このアプローチをさらに最適化するためのより良い方法があるかもしれませんが、これは私の頭の中で言及したものです. それが役に立てば幸い。

于 2015-05-03T05:51:22.790 に答える