掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26128

2文探索木
投稿者---tou(2006/02/15 14:37:51)


2分探索木の表示の質問なのですが、
通りがけ、行きがけ、帰りがけ順で表示をして、それぞれ昇順、降順でも表示をしたいのですが、とりあえず、通りがけ順での昇順、降順を試したのですが、同じデータが何度も出てきたりしてうまくいきません。
昇順と降順で、表示方法を変えるときにデータの位置を先頭にを戻すのではないのかと考えたのですが、どうしたら戻せるのかがよくわかりません。
どなたか教えてください。お願いします。

ソースの一部↓
/*--- 全ノードのデータを表示 ---*/
void PrintTree(BinNode *p)
{
    if (p != NULL) {
        
        PrintTree(p->right);
            PrintData(p->data);
        PrintTree(p->left);
    }
    /*ここにデータの位置を先頭に戻すものを入れたい*/
        if (p != NULL) {        
    
        PrintTree(p->left);
            PrintData(p->data);
            PrintTree(p->right);
    }
    
}
/*--- メイン関数 ---*/
int main(void)
{
    Menu     menu;
    BinNode  *root;

    root = NULL;
    do {
        Data  x;
        BinNode  *temp;

        switch (menu = SelectMenu()) {
         case Insert :  x = Read("挿入", NO | NAME);
                        root = InsertNode(root, x); break;

         case Search :  x = Read("探索", NAME);
            if ((temp = SearchNode(root, x)) != NULL)
                PrintData(temp->data);
                        break;

         case Print : puts("【一覧表】");
                PrintTree(root);    break;
        }
    } while (menu != Term);

    FreeTree(root);

    return (0);
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:2文探索木 26129 REE 2006/02/15 15:02:14
<子記事> Re:2文探索木 26130 kz3 2006/02/15 15:18:54


No.26129

Re:2文探索木
投稿者---REE(2006/02/15 15:02:14)


>2分探索木の表示の質問なのですが、
>通りがけ、行きがけ、帰りがけ順で表示をして、それぞれ昇順、降順でも表示をしたいのですが、とりあえず、通りがけ順での昇順、降順を試したのですが、同じデータが何度も出てきたりしてうまくいきません。
>昇順と降順で、表示方法を変えるときにデータの位置を先頭にを戻すのではないのかと考えたのですが、どうしたら戻せるのかがよくわかりません。
>どなたか教えてください。お願いします。

先頭に戻すだけでは、うまくいかないどころか、無限ループになってしまいますよ。

一番簡単で、お勧めなのは、通りがけ、行きがけ、帰りがけ順の各昇順、降順で、PrintTreeに代わる関数を6つ作ることです。
PrintTreeでそれを全て表示したいのであれば、PrintTreeから、それら6つを呼び出すだけです。

再帰関数になっているので、一つにまとめるのは至難の業ですし、もし出来ても無駄に分かりにくくなるだけです。



この投稿にコメントする

削除パスワード

No.26130

Re:2文探索木
投稿者---kz3(2006/02/15 15:18:54)


/*--- 全ノードのデータを表示 ---*/
void PrintTree(BinNode *p)
{
    if (p != NULL) {
        
        PrintTree(p->right);
            PrintData(p->data);
        PrintTree(p->left);
    }
    /*ここにデータの位置を先頭に戻すものを入れたい*/
        if (p != NULL) {        
    
        PrintTree(p->left);
            PrintData(p->data);
            PrintTree(p->right);
    }
    
}
欲張って一つの関数に複数の処理を詰め込むから問題が大きくなってしまうのだと思います。

/*--- 全ノードのデータを表示 ---*/ void PrintTree( BinNode *p ) { BinNode *root = p; /* 降順で表示 */ PrintTreeDescend( root ); /* 昇順で表示 */ PrintTreeAscende( root ); }
小さく関数をまとめることで考える問題を小さくすることができます。



この投稿にコメントする

削除パスワード

No.26132

Re:2文探索木
投稿者---tou(2006/02/15 15:49:35)


返信ありがとうございます。
教えていただいたように、関数をひとつずつ作って実行してみたのですが、
ソースは
void Tourigakekou(BinNode *p)
{
    printf("通りがけ降順\n");
        if (p != NULL) {        
    
       Tourigakekou(p->right);
         PrintData(p->data);
        Tourigakekou(p->left);  
    } 
}

void Ikigakekou(BinNode *p)
{
    printf("行きがけ降順\n");
        if (p != NULL) {        
     PrintData(p->data);
      Ikigakekou(p->right); 
        Ikigakekou(p->left);    
    } 
    
}

void Kaerigakekou(BinNode *p)
{
    printf("帰りがけ降順\n");
        if (p != NULL) {        
    
      Kaerigakekou(p->right);
        Kaerigakekou(p->left);
 PrintData(p->data);        
    } 
    
}

void Tourigakesyou(BinNode *p)
{
    printf("通りがけ昇順\n");
        if (p != NULL) {        
    
      Tourigakesyou(p->left);   
         PrintData(p->data);
         Tourigakesyou(p->right);
    } 
}

void Ikigakesyou(BinNode *p)
{
        printf("行きがけ昇順\n");
        if (p != NULL) {        
        
     PrintData(p->data);        
      Ikigakesyou(p->left);
          Ikigakesyou(p->right);
    } 
}

void Kaerigakesyou(BinNode *p)
{
        printf("帰りがけ昇順\n");
        if (p != NULL) {        
    
       Kaerigakesyou(p->left);  
          Kaerigakesyou(p->right);  
         PrintData(p->data);
    } 
}


/*--- 全ノードのデータを表示 ---*/
void PrintTree(BinNode *p)
{

    BinNode *root = p;

        Tourigakesyou(root);
        Tourigakekou(root);
        Ikigakesyou(root);
        Ikigakekou(root);
        Kaerigakesyou(root);
        Kaerigakekou(root);
 }   
で、実行をすると、
15 oda
72 kobayashi
25 tanaka
99 isobe
87 takanashi というデータを入力したときに、

【一覧表】
通りがけ昇順
通りがけ昇順
通りがけ昇順
通りがけ昇順
番号:99 氏名:isobe
通りがけ昇順
番号:72 氏名:kobayas
通りがけ昇順
番号:15 氏名:oda
通りがけ昇順
通りがけ昇順
番号:87 氏名:takanas
通りがけ昇順
通りがけ降順
通りがけ降順
通りがけ降順
番号:87 氏名:takanas
通りがけ降順
番号:15 氏名:oda
通りがけ降順
通りがけ降順
番号:72 氏名:kobayas
通りがけ降順
通りがけ降順
番号:99 氏名:isobe
通りがけ降順
.
.
.
というようになってうまくいきません。どこが悪いのでしょうか?



この投稿にコメントする

削除パスワード

No.26134

Re:2文探索木
投稿者---REE(2006/02/15 17:22:28)


>返信ありがとうございます。
>教えていただいたように、関数をひとつずつ作って実行してみたのですが、

>(略)
>というようになってうまくいきません。どこが悪いのでしょうか?

どこが、期待と違うのですか?

もし、「通りがけ降順」などが、複数回表示されてしまうことが期待と違うのでしたら、
再帰関数は、それ自信が何度も呼ばれることを思い出してください。




この投稿にコメントする

削除パスワード

No.26137

Re:2文探索木
投稿者---tou(2006/02/15 17:38:39)


返信ありがとうございます。

>もし、「通りがけ降順」などが、複数回表示されてしまうことが期待と違うのでしたら、
>再帰関数は、それ自信が何度も呼ばれることを思い出してください。

そこが考えていたものと違ったのですが、通りがけ順などの表示をとっても、
【一覧表】

番号:99 氏名:isobe


番号:72 氏名:kobayashi


番号:15 氏名:oda

番号:87 氏名:takanashi


番号:25 氏名:tanaka




番号:25 氏名:tanaka

番号:87 氏名:takanashi



番号:15 氏名:oda

番号:72 氏名:kobayashi

番号:99 氏名:isobe
という表示のされ方をします。どうしてこうなるのか自分ではよくわかりません。教えていただけると助かります。





この投稿にコメントする

削除パスワード

No.26138

Re:2文探索木
投稿者---tou(2006/02/15 18:17:29)


回答ありがとうございました。
表示の問題は、解決しました。

もうひとつ質問をしたいのですが、
ファイルからデータを読み込んで、操作をした後に出力をしたいのですが、ファイルからデータを読み込むところまではできたのですが、データを格納するところがうまくいきません。
ノードを挿入する関数ですが、


.痢璽匹空ならノードをセットし
 違うときは、
¬樵阿鯣羈咾掘同じものならばエラーを表示し、
 違うときは、文字列の差をcondに格納し、
condの値がマイナスならばノードの左側にデータをいれ、
 プラスなら、ノードの右側にでーたを入れる。
ということを繰り返すという風に考えているのですが、これであっているのでしょうか?

#include <stdio.h>

int main( void /*--- ノードを挿入 ---*/
BinNode *InsertNode(BinNode *p, Data x)
{
    int  cond;

    if (p == NULL) {
        p = AllocNode();
        SetBinNode(p, x, NULL, NULL);
    } else if ((cond = NameCmp(x, p->data)) == 0)
        printf("【エラー】%sは既に登録されています。\n", x.name);
    else if (cond < 0)
        p->left  = InsertNode(p->left, x);
    else
        p->right = InsertNode(p->right, x);
    return (p);
})

/*--- ノードの各メンバに値を設定 ----*/
void SetBinNode(BinNode *n, Data x, BinNode *left, BinNode *right)
{
    n->data  = x;               /* データ */
    n->left  = left;                /* 左の子ノードへのポインタ */
    n->right = right;            /* 右の子ノードへのポインタ */
}
/*--- データの氏名を比較 ---*/
int NameCmp(Data x, Data y)
{
    return (strcmp(x.name, y.name));
}


ソース↓
int main(void)
{
    Menu     menu;
    BinNode  *root;
    FILE *fin, *fout,*fp;
    char infile[40], outfile[40];
    BinNode *ptr;
       Data x;
    

printf( "入力ファイル名 = " );
    gets( infile );
    printf( "出力ファイル名 = " );
    gets( outfile );
    if( ( fin=fopen( infile, "r" ) ) == NULL ) {
        printf( "入力ファイルがオープンできません\n" );
        exit( 1 );
    }
 
    while( fscanf(fin, "%d  %s", &x.no, x.name)!=EOF){
        
    InsertNode(root,x);/*これでは違うのでしょうか?*/
        printf(" no = %d %4s\n", x.no, x.name);
     }

        root = NULL;
    do {
        Data  x;
        BinNode  *temp;

        switch (menu = SelectMenu()) {
         case Insert :  x = Read("挿入", NO | NAME);
                        root = InsertNode(root, x); break;

         case Search :  x = Read("探索", NAME);
            if ((temp = SearchNode(root, x)) != NULL)
                PrintData(temp->data);
                        break;

         case Print :    puts("【一覧表】");
                PrintTree(root);    break;
        }
    } while (menu != Term);
    fseek( fin, 0, SEEK_SET );

if( ( fout=fopen( outfile, "w" ) ) == NULL ) {
        printf( "出力ファイルがオープンできません\n" );
        exit( 1 );
    }
    ptr = root;
while (ptr != NULL) {
    fprintf( fout, "%d %s %d\n",ptr->right, ptr->data,ptr->left );  
    
}

 
    fclose( fin );
    fclose( fout );

    FreeTree(root);

    return (0);
}



この投稿にコメントする

削除パスワード

No.26139

Re:2文探索木
投稿者---REE(2006/02/15 18:46:15)


>ということを繰り返すという風に考えているのですが、これであっているのでしょうか?

考え方はいいと思いますが、実装に問題があります。

気付いた部分だけ、
1.rootが初期化されていない。
2.rootが更新されない。
3.読み込みが終わった後に、rootをクリアしている。(データを捨てている?)



この投稿にコメントする

削除パスワード

No.26140

Re:2文探索木
投稿者---tou(2006/02/15 19:04:38)


>1.rootが初期化されていない。
>3.読み込みが終わった後に、rootをクリアしている。(データを捨てている?)
rootを読み込みの前に持ってきたのですが、これでいいのでしょうか?
root = NULL;/*この部分*/
printf( "入力ファイル名 = " );
    gets( infile );
    printf( "出力ファイル名 = " );
    gets( outfile );
    if( ( fin=fopen( infile, "r" ) ) == NULL ) {
        printf( "入力ファイルがオープンできません\n" );
        exit( 1 );
    }
 
    while( fscanf(fin, "%d  %s", &x.no, x.name)!=EOF){
        
    InsertNode(root,x);
        printf(" no = %d %4s\n", x.no, x.name);
     }

        


>2.rootが更新されない。

読み込んだ順に、格納をするようになっているように見えるのですが、なぜこのままでは更新されないのでしょうか?
どのようにしたら更新されてうまく格納できるようになるのでしょうか?


この投稿にコメントする

削除パスワード

No.26141

Re:2文探索木
投稿者---REE(2006/02/15 19:34:58)


>読み込んだ順に、格納をするようになっているように見えるのですが、なぜこのままでは更新されないのでしょうか?

こちらを参照してください。
http://www9.plala.or.jp/sgwr-t/c/sec11-2.html
あなたのプログラムでのrootの渡し方は(1)のケースにあたります。

>どのようにしたら更新されてうまく格納できるようになるのでしょうか?

理由が分かれば、解決できると思うので、あえて書かないでおきます。



この投稿にコメントする

削除パスワード

No.26162

Re:2文探索木
投稿者---tou(2006/02/16 14:10:36)


>あなたのプログラムでのrootの渡し方は(1)のケースにあたります。
アドレスを渡すというのはわかりました。
 int count=0;   
   root = NULL;
 
    while( fscanf(fin, "%d  %s", &x.no, x.name)!=EOF){
        
    InsertNode((root+count),x);

        printf(" no = %d %4s\n", x.no, x.name);
            count++;
     }

としたのですが、
結果は、
no = 1 iti
でエラーが出て強制終了させられてしまいます。

>理由が分かれば、解決できると思うので、あえて書かないでおきます。
基本的なことを聞いていて申し訳ないのですが、もう少し教えていただけないでしょうか?




この投稿にコメントする

削除パスワード

No.26163

Re:2文探索木
投稿者---nop(2006/02/16 14:28:15)


> InsertNode((root+count),x);

何故、rootにcountを加算しているのでしょうか?
任意の位置に挿入したいのでしたら、
rootから挿入位置まで辿っていく必要があるのでは?

# 例えば、rootの右に追加したければroot->rightを指定など...


この投稿にコメントする

削除パスワード

No.26164

Re:2文探索木
投稿者---tou(2006/02/16 14:39:38)


>何故、rootにcountを加算しているのでしょうか?
>任意の位置に挿入したいのでしたら、
>rootから挿入位置まで辿っていく必要があるのでは?

rootから挿入位置までたどっていくのは
BinNode *InsertNode(BinNode *p, Data x)
{
    int  cond;

    if (p == NULL) {
        p = AllocNode();
        SetBinNode(p, x, NULL, NULL);
    } else if ((cond = NameCmp(x, p->data)) == 0)
        printf("【エラー】%sは既に登録されています。\n", x.name);
    else if (cond < 0)
        p->left  = InsertNode(p->left, x);
    else
        p->right = InsertNode(p->right, x);
    return (p);
}

この関数でできると思うので、ファイルから読み込んだ文字をこの関数に渡して格納をしたいのですが、その格納のところでアドレスを渡すということでこういう風に書いたのですが、考え方はこれであっているのでしょうか?


この投稿にコメントする

削除パスワード

No.26165

Re:2文探索木
投稿者---nop(2006/02/16 15:13:15)


>ファイルから読み込んだ文字をこの関数に渡して格納をしたいのですが

それであれば、その文字を別なパラメータとして渡す必要があります。


この投稿にコメントする

削除パスワード

No.26166

Re:2文探索木
投稿者---tou(2006/02/16 15:17:05)


>それであれば、その文字を別なパラメータとして渡す必要があります。
よくわからないのですが、具体的にはどういう風にするのでしょうか?


この投稿にコメントする

削除パスワード

No.26167

Re:2文探索木
投稿者---REE(2006/02/16 15:20:30)


>>あなたのプログラムでのrootの渡し方は(1)のケースにあたります。
>アドレスを渡すというのはわかりました。

アドレス渡しについての理解が不足しているようです。
なお、今回は、無理にアドレス渡しをする必要はないでしょう。
前回の説明は、rootが更新されていない理由を示すためのものです。

ちょっと質問です。
 InsertNodeの戻り値は、何のためにあるのですか?



この投稿にコメントする

削除パスワード

No.26168

Re:2文探索木
投稿者---tou(2006/02/16 15:50:06)


> InsertNodeの戻り値は、何のためにあるのですか?
ノードを挿入した後に今どの位置にいるかということを返していると思うのですが、一度

    

BinNode  *root,*y

while( fscanf(fin, "%d  %s", &x.no, x.name)!=EOF){
        
     y=InsertNode(root,x);
    InsertNode(y,x);

という風なやり方をしてみて分かったのですが、最初のInsertNodeの部分で一通りデータを読み込んでいるのですが、表示がされないというのはどうしてなのでしょうか?



この投稿にコメントする

削除パスワード

No.26172

Re:2文探索木
投稿者---REE(2006/02/16 16:21:31)


1回目のInsertNode(root,x);は、rootがNULLの状態で実行されます。
このとき、新しいノードが作成されますが、rootはNULLのままです。
その新しいノードはどこにいってしまうのでしょう?

当然、その位置を、rootに設定しなければいけませんね。

>という風なやり方をしてみて分かったのですが、最初のInsertNodeの部分で一通りデータを読み込んでいるのですが、表示がされないというのはどうしてなのでしょうか?

以前に言った問題点の(2)が改善されていないからです。



この投稿にコメントする

削除パスワード

No.26175

Re:2文探索木
投稿者---tou(2006/02/16 16:58:39)


>その新しいノードはどこにいってしまうのでしょう?
>
>当然、その位置を、rootに設定しなければいけませんね。
>
いろいろ考えてみたのですが、どうしてもよく分かりません。
もう少し具体的に教えていただけないでしょうか。
何度もすみません。


この投稿にコメントする

削除パスワード

No.26178

Re:2文探索木
投稿者---REE(2006/02/16 17:29:42)


>>その新しいノードはどこにいってしまうのでしょう?

>いろいろ考えてみたのですが、どうしてもよく分かりません。

考えて分からないのなら、デバッグして、突き止めてください。
ステップ実行できれば、簡単に分かるはずです。
もし、ステップ実行できなくてもprintfを埋め込めば分かります。


この投稿にコメントする

削除パスワード

No.26250

Re:2文探索木
投稿者---REE(2006/02/22 10:57:49)


> case Insert : x = Read("挿入", NO | NAME);
> root = InsertNode(root, x); break;
ここと同じように

InsertNode(root,x);
を以下に書き換えるだけだったのに・・・
root=InsertNode(root,x);

元プログラムを完全に理解せずに、改造してただけのようですね。
http://www.bohyoh.com/Books/CalgoA/EX/ALGOEX1003.html



この投稿にコメントする

削除パスワード

No.26170

Re:2文探索木
投稿者---kz3(2006/02/16 16:18:49)



BinNode *InsertNode(BinNode *p, Data x) { int cond; if ( p == NULL ) { p = AllocNode(); SetBinNode( p , x , NULL , NULL ); } else if (( cond = NameCmp(x, p->data )) == 0 ) printf( "【エラー】%sは既に登録されています。\n" , x.name ); else if (cond < 0) p->left = InsertNode( p->left , x ); else p->right = InsertNode( p->right , x ); return (p); }
・気になった点 NULL で初期化された二分探索木の根へのポインタ root をInsertNode() 関数に渡す。 InsertNode() 関数は与えられたポインタ p (が示す領域)が NULL なら(無ければ) AllocNode() 関数でノードを確保し、そのポインタを p に格納して終了する。 ただし関数の仮引数は自動変数同様なので関数を抜けると同時に破棄される。 ということは先ほど確保した領域へのポインタを保持していた仮引数 p は すぐさま使い物にならなくなり、根は NULL のままである。 AllocNode() 関数( malloc()使用? )で確保された領域は 関数が終了してもそのままメモリに残っているのでメモリリークを起こしている。



この投稿にコメントする

削除パスワード

No.26176

Re:2文探索木
投稿者---kz3(2006/02/16 17:03:42)


よくある数値型変数の値渡しと参照渡しの文字列へのポインタ変数版です。
参考にしてみてください。

#include <stdio.h> void swap_fault( char *s1, char *s2 ) { char *p; /* ポインタを交換する */ p = s1; s1 = s2; s2 = p; } void swap_true( char **s1, char **s2) { char *p; /* ポインタの先のポインタを交換する */ p = *s1; *s1 = *s2; *s2 = p; } int main( void ) { /* ポインタで文字列を捕まえている */ char *hoge = "HOGE"; char *piyo = "PIYO"; printf( "%s , %s\n" , hoge , piyo ); /* それぞれの文字列へのポインタを交換しているつもり */ swap_fault( hoge , piyo ); printf( "%s , %s\n" , hoge , piyo ); /* それぞれの文字列へのポインタを交換する */ swap_true( &hoge , &piyo ); printf( "%s , %s\n" , hoge , piyo ); return 0; }



この投稿にコメントする

削除パスワード

No.26179

Re:2文探索木
投稿者---tou(2006/02/16 17:31:23)


>参考にしてみてください。
ありがとうございます。

前にも書いてあるのですが、どうやって次のアドレスを渡すのかも教えていただけると助かります。



この投稿にコメントする

削除パスワード

No.26181

Re:2文探索木
投稿者---kz3(2006/02/17 15:59:36)


>> 参考にしてみてください。
> ありがとうございます。
>
> 前にも書いてあるのですが、どうやって次のアドレスを渡すのかも教えていただけると助かります。

# 紛らわしい説明でしたので簡素に。

InsertNode( p->left , x );
これはポインタ p が示すオブジェクトの left が保持しているポインタの値を
InsertNode() 関数に渡すという意味ですよね。

InsertNode() 関数がこのポインタを p で受け取って NULL であれば、
p に新たに確保したノードへのポインタを格納して関数終了。

# この時点でメモリリークが発生

left ( や right ) が保持しているポインタを InsertNode() 関数に渡すのではなくて、
left 自身へのポインタを InsertNode() 関数に渡し、
InsertNode() 関数には関数側で動的に確保したノードへのポインタを left に格納してもらう、
これが正しい方法となります。

変数自身へのポインタは & 演算子で取得できます。( 演算子の優先順位を要確認 )






この投稿にコメントする

削除パスワード

No.26183

Re:2文探索木
投稿者---tou(2006/02/17 16:21:12)


>変数自身へのポインタは &演算子で取得できます。( 演算子の優先順位を要確認 )

すいません。追加です。

    BinNode  *root,*y;

     y=InsertNode(root,x);
    
    InsertNode(&y,x);
    


ということでしょうか?







この投稿にコメントする

削除パスワード

No.26184

Re:2文探索木
投稿者---kz3(2006/02/18 09:55:01)


>> 変数自身へのポインタは &演算子で取得できます。( 演算子の優先順位を要確認 )
>    BinNode  *root,*y;
>
>     y=InsertNode(root,x);
>    
>    InsertNode(&y,x);
> ということでしょうか?

示したコードの意味が分かりません。

ループ構造を省いているのだと思いますが
単体を見せられてもそれがループ中で実行されるのかどうか分かりません。

また最初の InsertNode() では戻り値を使っているのに
二つ目の InsertNode() では使っていない、この違いも分かりません。

最初の InsertNode() では root が保持しているポインタを仮引数に渡していますが、
二つ目の InsertNode() では y 自身のポインタを渡している、
この違いも分かりません。

関数の呼び出し方法が変われば仮引数の宣言も変わり、
関数内の処理もおのずと変わってくるハズです。
関数の呼び出し方法と関数の定義、セットで貼り付けるのが良いと思います。

root が保持しているポインタを InsertNode() に渡して
新たなノードへのポインタを y に渡して、
y 自身のポインタを InsertNode() に渡して・・・
結局 root は何も捕まえていないままです。

( 単方向 )探索木の操作は根からノードをたどることが基本です。( 親ノードへのポインタを持っていないから )

空の探索木に最初のノードを挿入するということは、
根にノードを割り当てることになりますから・・・( 大ヒント )

根にノードが割り当てられたらそれ以降の挿入は
根からたどって大小関係の正しい位置( の一つ手前 )のノードに
新しいノードへのポインタを張ることになります。( ヒント )









この投稿にコメントする

削除パスワード

No.26194

Re:2文探索木
投稿者---kzwerty(2006/02/19 19:34:52)


くぁうぇsrdtfyぐひじょk


この投稿にコメントする

削除パスワード

No.26244

Re:2文探索木
投稿者---tou(2006/02/21 10:23:10)


ありがとうございました。
何とか解決することができました。
もう少し勉強をしておきます。

いろいろと教えてくださった皆さん本当にありがとうございました。



この投稿にコメントする

削除パスワード

No.26246

Re:2文探索木
投稿者---REE(2006/02/21 12:08:48)


>ありがとうございました。
>何とか解決することができました。
>もう少し勉強をしておきます。
>
>いろいろと教えてくださった皆さん本当にありがとうございました。

できたら、どう解決したかの報告をお願いします。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧