2012-03-01 34 views
-1

したがって、私はBSTにiを挿入する破壊関数BST insertbst(int i、BST t)を定義する必要があります。つまり、iを含むようにtを変更し、結果のツリーを返します。実行時間はO(高さt)でなければなりません。バイナリ検索ツリーへの挿入

私は私のコードで使用される他の機能はで見つけることができ、このバージョンを思い付く...しかし

BST insertbst(int i, BST t) { 
    if (t == NULL) { 
     return BSTmake(i, NULL, NULL); 
    } else if (i < BSTkey(t)) { 
     return BSTmake(BSTkey(t), insertbst(i ,BSTleft(t)), BSTright(t)); 
    } else { 
     return BSTmake(BSTkey(t), BSTleft(t), insertbst(i ,BSTright(t))); 
    } 
} 

私に次のエラーのideone.com/xhxb6を与えている

:任意の提案を行うためにhttp://pastebin.com/TVYRE4Nd それは破壊的な、または私のヒープエラーを避けるためにそれを変更する?

.hファイル:http://ideone.com/QeSTl

テストファイル:http://pastebin.com/9ca5i4My

+0

あなたの実際の質問が何であるかは分かりません。おそらくあなたはあなたの投稿を明確にすることができます。 – bitmask

+0

コードリンクにはログインが必要です。 –

+0

私は基本的に私の機能をdestrutiveにしたいのですが(tを変更する)...ヒープエラーなしで実行するコードを取得するのに問題があるようです – Thatdude1

答えて

0

あなたは間違いなくそれを確認することができますよう、それが呼ばれる新しいBST node毎回、作成しているとして、あなたが今やっているようにあなたがBSTmake()を使用することはできません新しいノードは挿入ごとに1回だけ作成する必要があります。 main

BST x = BSTmake(2, (BSTmake(1, NULL, NULL)), (BSTmake(3, NULL,NULL))); 
BST y = insertbst(4, x); 

で次の2つのステートメントのために今

私はyが指しすべき場所についてのあなたの仮定を知りません。一般に、BSTの実装では、insertを単独で呼び出し、nodeを挿入し、root nodeを渡します。このアプローチを使用すると、コードをより簡単に理解できるようになります。このパターンを使用するには、2行目をinsertbst(4, &x)に変更する必要があります。

その後、以下のようにあなたのinsertbstの実装を変更する必要があります:

  • newnodeの親を表すノードポインタへのポインタとして二番目の引数を渡します。
  • BST *tがnullの場合は、新しいノードを作成し、それを指すようにノードにポインタを割り当てます。
  • i < BSTkey(t)またはi > BSTKey(t)の場合、ポインタを左のサブツリーまたは右のサブツリーのいずれかに第2引数として渡して、insertbst()を再帰的に呼び出す必要があります。

これは、ように見えるかもしれないものです:割り当てられたメモリチャンクにvoid *たポイントを返しmalloc()また

BST insertbst(int i, BST *t) { 
    if (*t == NULL) { 
     *t = BSTMake(i, NULL, NULL); 
    } 
    else if (BSTkey(newnode) < BSTkey(*t)) { 
     insertbst(i, &t->left); 
    } 
    else { 
     insertbst(i, &t->right); 
    } 
} 

。私はBSTがのようなものをtypedefと書かれていると仮定しています。したがって、newnode宣言をBST newnode = (BST)malloc(sizeof(struct bst_node));と変更する必要があります。

+0

typdefを明確にするために.hファイルを追加しました。私は混乱しています、insertbstはBSTとintを消費するはずです...そしてそれに応じてintを追加しますか?なぜ私たちはBSTとポインタを消費していますか? – Thatdude1

+0

'insertbst()'の呼び出し後に 'BST y'が何を指し示すべきか説明できますか? 2番目の引数は、挿入が最終的に行われるツリーノードの構造を変更する必要があるため、BSTポインタ自体がポインタであり、2番目の引数は** BSTポインタの_address_ **を保存することです。 'insertbst'が返った後に木が空であれば、あなたの' BST x'は挿入された新しいノードを指しているはずです。これが 'insertbst'が定義されている理由です。 – vvnraman

+0

私はBSTがどこにでも向いているはずだと思っています。入力されたBSTを編集して、適切なノードが新たに追加された "i"ノードを指し示すようにしてください...私はintとBST thouを消費するinsertbstが必要です。それをする方法はありませんか? – Thatdude1

関連する問題