• ベストアンサー

二分探索木と二分探索の違い

高校のときにCOBOLを用いた二分探索を習いました。 今大学でコンピューター科学を勉強しています。予習をしていたら二分探索木が出てきました。 添付画像のような二分木があるとき、a~jの各ノードに1~10の整数のどの整数が入るか。 という問題ですが、ちんぷんかんぷんです。 二分探索木というのは、検索で用いる二分探索と同じ考えなのでしょうか。 もし、同じなら、1~10の中央値の5がルートになりますよね。 このような問題の簡単な求め方があれば教えてください。お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3

節に格納される10種の数値を昇順に並べておく。 1,2,3,4,5,6,7,8,9,10 根aに着目。 aより小さい要素は4つ(b,d,e,g 順不同)で, aより大きい要素は5つ(c,f,h,i,j 順不同) よって,根a=5 (小さい要素の群)根(大きい要素の群) (1,2,3,4)5(6,7,8,9,10) -------- (1,2,3,4)に対して,節bに着目。 bより小さい要素は2つ(d,g 順不同)で, bより大きい要素は1つ(e) よって,節b=3 (小さい)節(大きい) (1,2)3(4) よって,節e=4 -------- (1,2)に対して,節dに着目。 dより大きい要素は1つ(g) よって,節d=1,節g=2 -------- (6,7,8,9,10)に対して,節cに着目。 cより小さい要素は4つ(f,h,i,j 順不同) よって,節c=10 (小さい要素の群)節 (6,7,8,9)10 -------- (6,7,8,9)に対して,節fに着目。 fより小さい要素は1つ(h) fより大きい要素は2つ(i,j 順不同) よって,節f=7 (小)節(大) (6)7(8,9) よって,節h=6 -------- (8,9)に対して,節iに着目。 iより小さい要素は1つ(j) よって,節i=9 (小)節 (8)9 よって,節j=8

その他の回答 (2)

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.2

>添付画像のような二分木があるとき、a~jの各ノードに1~10の整数のどの整数が入るか。 参考URLに整数値の違う例示がありますので、そこから類推してください。

参考URL:
http://ufcpp.net/study/algorithm/col_tree.html
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

二分木の探索方法には、次の3パターンがあります。 1)行きがけ 2)通りがけ 3)帰りがけ 添付画像の二分木を各パターンで探索する際に各ノードをどういう順序で通るかは、調べてみてください。 >添付画像のような二分木があるとき、a~jの各ノードに1~10の整数のどの整数が入るか。 この問題を解くためのポイントは、「二分木を通りがけで探索すると、データの昇順(または降順)に探索する」です。

関連するQ&A

  • schemeで二分探索木の問題について

    schemeの問題で,「二分探索木であることを判定する関数を定義せよ」という問題があります。二分探索木とは,左の部分木に含まれる値はノードの値より小さく,右は大きい二分木です。 頑張って考えたのですが,まったくわかりません。 どなたかご回答をしていただけると助かります。 よろしくお願いします。

  • 二分探索木の問題

    分からない問題があります。 {4,5,6,8,9,10,18}を要素とする2分探索木を考える。4を探索するのに最も手間のかからない、高さの異なる2分探索木を2つ図示しなさい。 どなたかお教え下さい。

  • 探索木の問題について

    探索木について。 探索木において、探索効率を高めるため(探索経路を短くするため)、子の数を最大m個までとするm分探索木を考える。この木の探索についての計算量は、どのように考えれば良いですか。 説明してください。 という問題なのですが 画像のA,Bのタイプのどちらで考えればいいのかわかりません そこで、どちらのタイプで考えればいいのか あわよくば、問題についても答えを教えてください よろしくおねがいします

  • 二分探索木のパターン数

    二分探索木のパターン数 二分探索木とは、上の値より大きければ右に、小さければ左に子を作っていくツリー状のものです。 例えば     6    / \   4    9  /\ /  2  5 8     /    7 こんな感じです。 http://ja.wikipedia.org/wiki/%e4%ba%8c%e5%88%86%e6%9c%a8 で、問題なのですが、[1,2,3,4,5,6,7,8,9]といった9つの数値がある時、二分探索木は何通りできるか。 というものです。図を書いて色々考えてみたのですが求め方が分かりません。 全パターン書き出すのは量的に辛すぎますし、CやPで計算するのでしょうが、どのような式になるのでしょうか?

  • 退化木をバランス木にしたい

    二分探索木でアドレス帳を作っています。 二分探索木はノードの削除を繰り返すと退化木になってしまいますが、 これを回避するために二分探索木を再構成して、バランス木に近い形にしたいのです。 この二分探索木を再構成するアルゴリズムが全く思いつかず困っています。 詳しい方、ご教授お願い申し上げます。 ちなみに言語はCです。

  • 二分探索木のheight(高さ?)を見つけるアルゴリズム

    Binary Search Tree(=二分探索木)のheight(高さ?)を見つけるメソッドを作りたいのですが、 そのアルゴリズムが頭にうまく浮かびません。 まず思いついたのは一つ一つのNode(=ノード)をそれぞれのLeaf(=リーフ、葉?)まで辿っていって それらのheightを全部記憶させておいて後で比較するという…最も原始的な方法です。 しかし、Treeの大きさも未知なので用意する変数の数も未知になって どう考えても不適当でしょう(当たり前か(^^ゞ)。 Recursion(=再帰)を使えばいいのでしょうか? そうだとしてもどうすればいいのか…。 アルゴリズムがパッと浮かぶ方、どうか教えて下さい。

    • ベストアンサー
    • Java
  • 2分木

    実行すると 「トップノードの値を入力してください。20 ノード[20:深さ0]の左の子の値を入れてください。15 ノード[20:深さ0]の右の子の値を入れてください。40 ノード[15:深さ1]の左の子の値を入れてください。11 ノード[15:深さ1]の右の子の値を入れてください。18 ノード[11:深さ2]の左の子の値を入れてください。/ ノード[18:深さ2]の左の子の値を入れてください。17 ノード[18:深さ2]の右の子の値を入れてください。/           ・ が表示されて2分木のデータを作成するプログラムを作りたいのです。絵で表すと、       20 / \     15 40 / \ /\ 11 18 30 55 / /\ \ 17 25 33 61 のようになります(なんか絵がずれて表示される)。 一応、自分で考えてみたのですが #include<stdio.h> #include<malloc.h> struct data { int kazu; struct data *left; struct data *right; }; main() { struct data *root,*p; root=(struct data *)malloc(sizeof(struct data)); printf("トップノードの値を入れてください:"); scanf("%d",root->kazu); root->left=root->right=NULL; while(1){ p=(struct data *)malloc(sizeof(struct data)); printf("ノード%d,深さ%dの左の子の値を入れてください",root->kazu, scanf("%d", ); printf("ノード%d,深さ%dの右の子の値を入れてください",root->kazu, scanf("%d", ); if( break; なんか全然良くわからないのです。アルゴリズムの本を見て勉強していて、データ構造は理解できたのですが、2分木(グラフ)で詰まってしまいました。 小さい順に数を表示させるとか、そういうのじゃなくて、単にデータを格納するだけです。どうかよろしくお願いします。

  • B木とR木の違いを教えて下さい

    当方、今年情報系の学科に入学しました大学1回生です。 大学のレポートで 問:B木とR木のキー、及び探索方法の違いを調べよ。 という問題が出題されたのですが R木というものに関する資料が少なくて困っています。 今、自分で調べた結果 探索方法に関しては ・B木 根から始めて探索キーの値とノードのキーを比較しながら 部分木をたどっていく。 葉に到達したときのに葉のキーの値と探索キーが等しければ成功、 等しくなければ失敗。 ・R木 点質問で探索キー(?)を含むMBRを探索 範囲質問 というのが違いかなと思うのですが、上手く1つの文章で表現できません。 (R木の探索方法についてはイマイチ理解できない)  またキーに関する違いと言うのもイマイチよく分かりません。 違いを教えていただけると嬉しいです。 また、どなたかR木に関する詳しい解説のあるHPか書籍をご存知ではないでしょうか? 宜しく御願い致します。

  • 2分探索木、挿入

    行き詰まりました。 2分探索木の要素挿入です。 何がいけないのでしょうか?? 思うように動作しません。 ルートはどうやら設定されるようですが、 その他のデータがうまく挿入されません。 たぶんポインタの使い方がなってないようなのですが、 どこをどうしていいか分からないのでどなたか教えてください。 (インデントくずれました・・・見にくくてすみません) データ構造は以下の通りです。 node{ key //item template ですがint とみなしてください。   node *left //左の子へのポインタ   node *right //右の子へのポインタ } root{ node *root //ルートへのポインタ } //ここからソース(多少省略してます。) insert(const K & newKey) {     node<K> *temp;     if(empty()){//ルートの設定。         temp = new node<K>(newKey, NULL,NULL);         root = temp;     }else{//木が既存する場合         insertItem(root, newKey);     } } insertItem(node<K> *fact, const K & newKey) {     node<K> *temp,test;     if(fact == NULL){//要素挿入         temp = new node<K>(newKey,NULL,NULL);         fact = temp;         test = *fact;     }else{//挿入場所探索         test=*fact;         if(test.key == newKey){            cout<<"same key";         }else if(test.key > newKey){            insertItem(test.left, newKey); }else{ insertItem(test.right, newKey); } } }

  • アルゴリズム(2分探索木)の問題について

    2分探索木のアルゴリズムに関する問題について質問させていただきます。 [問題] 集合Sに対する2文探索木とは、ラベルつきの2分木で、 その頂点vにはSのある要素l(v)がラベルとしてつけられている。 l(v)は次の性質を満たす。 1.vの左部分木の頂点uに対して l(u) < l(v) 2.vの右部分木の頂点uに対して l(u) > l(v) 3.Sの任意の要素aに対して l(v) = a となる頂点vはちょうどひとつある。 図はキーワード集合{begin,else,end,if,then}をあらわす2分探索木の例である。 いま、集合Sを表す2分探索木と要素aが与えられているときa∈Sならば"はい"、 そうでなければ"いいえ"を出力するアルゴリズムを考える。 このアルゴリズムは、木の根rについて一回だけ再帰手続きSEARCH(a,r)を呼び出せばよい。 ただし、SEARCH(a,v)はvを根とする部分木中に要素aが含まれているかを判定する。 含まれているときに値"はい"を、そうでなければ値"いいえ"を返す。 ・アルゴリズム procedure SEARCH(a,v): if a = l(v) then return "はい" else if a < l(v) then if vが左の子wを持つ then return SEARCH( ア ) else return "いいえ" else イ 以下の問題に答えよ。 (1) 上のアルゴリズムのア,イを埋めよ。 (2) 上のアルゴリズムを参考にして、集合Sからのデータの削除DELETE(a,S)を考える。 削除すべき要素aが頂点vのラベルであったとする。そのとき次の3つの場合について、行うべき操作を記述せよ。 (i) 頂点vが葉である (ii) 頂点vの子が1個ある (iii) 頂点vの子が2個ある 以上です。 設問(1)は解けました。 答えは ア: a,w イ: a > l(v) then if vが右の子wを持つ then return SEARCH(a,w) else return "いいえ" になるのではないかと思います。 設問(2)についてなのですが、それぞれの場合について、どのような操作をすればよいのかは、 参考書などを読んで理解したのですが、どのように記述したらよいかがわかりません。 長文になってしまい申し訳ないのですが、回答よろしくお願いいたします。