プロが教える店舗&オフィスのセキュリティ対策術

C言語でプログラミングしています。

二分探索木を用いて探索するプログラムなのですが
与えられた値の前後の値(与えられた値より大きく(小さく)てその値
に一番近いもの)を見つけたいのですが分かりません。

いろいろとネット等で調べてみると「挿入してその左右を見る」
となっているのですが…。
普通の二分探索木ではだめなのでしょうか?

よろしくお願いします。

A 回答 (8件)

> ただ、C++はまったくわからない…



僕はC++/JavaなどのOO-languageじゃないと
めんどくさくて書く気になりません。
# てか、Cにこだわる理由もメリットもないので。
お役に立てずにごめんなさい。

# どなたかのフォローを希望します。
    • good
    • 0
この回答へのお礼

ありがとうございます。

私も出来ることならC++を使いたいのですが…
CとJAVAしかわからないですよ
少し勉強すればC++もいけると思うんですが、
そんな余裕はないし…

># どなたかのフォローを希望します。

どなたかよろしくお願いします。

お礼日時:2002/12/18 18:19

> 反則なのは百も承知で、C++なら数行で書けます。



...やっちまいました^^; 仕切り直し:

#include <iostream>
#include <set>

int main() {
std::set<int> tree;

for ( int i = 0; i < 10; i += 2) tree.insert(i);

std::set<int>::iterator hi = tree.lower_bound(5);
std::set<int>::iterator lo = hi; --lo;
std::cout << "5 は " << *lo << "と" << *hi << "の間" << std::endl;

return 0;
}

--- 実行結果 ---
5 は 4と6の間

この回答への補足

回答ありがとうございます。
私のやりたいことは伝わったようですね。

ただ、C++はまったくわからない…

ほんと何回もありがとうございます。

補足日時:2002/12/18 14:53
    • good
    • 0

反則なのは百も承知で、C++なら数行で書けます。


# '枝をたどれ'と答えてはみたものの、Cで実装するのは
# ひょいひょいとできることではないので...^^;

#include <iostream>
#include <set>

int main() {
typedef std::set<int> tree;

// 偶数で木を作る
for ( int i = 0; i < 10; i += 2) tree.insert(i);

// 5 の前後を見つける
std::set<int>::iterator lo = tree.lower_bound(5);
std::set<int>::iterator hi = lo; ++hi;
std::cout << "5 は " << *lo << "と" << *hi << "の間" << std::endl;

return 0;
}

--- 実行結果 ---
5 は 6と8の間
    • good
    • 0

> その値は木の中には存在しません。

だからその値に近い値を探し出したい
> のです。(その値に対して ’<’’>’の両方向で2つ)

木の中になくても同じことです。
検索の過程で辿った枝をスタックに保存し、
それをたどることでその前後が見つかります。

あるnodeに達した時点で存在しないことが明らかに
なったとき、そのnodeが持つ値はその値の両側の
どちらか一方であるはずです。他方はスタックを
逆に辿り、必要に応じてさらに枝をたどれば見つ
かります。

# O(logN)で見つけることを望んでいないなら、
# 深さ優先で列挙すれば小さい順に並ぶので
# それが最も簡単です。 時間計算量はO(N)ですが。

この回答への補足

何度もありがとうございます。

>O(logN)で見つけることを望んでいないなら
残念ながら望んでいるのです…
ニ分木を使おうとしたのはこのためです。
ソートすれば簡単なんですがね~

>検索の過程で辿った枝をスタックに保存し、
>それをたどることでその前後が見つかります。
その保存とその利用方法が難しいんですよ…

補足日時:2002/12/18 14:38
    • good
    • 0

> ある瞬間に値を渡すとその値の両隣?の値が分かるようにしたいのです。



その値を持つnodeが木の中に存在するなら、その両側の値は木の構造より明らかではないでしょうか。

# ごめんなさい、質問の意図がさっぱりわからんのです。

この回答への補足

補足説明ありがとうございます。
私の説明不足というか、言葉たらずというか…
分かりにくくて申し訳ありません。

>その値を持つnodeが木の中に存在するなら、
>その両側の値は木の構造より明らかではないでしょうか。

その値は木の中には存在しません。だからその値に近い値を探し出したい
のです。(その値に対して ’<’’>’の両方向で2つ)

今回もわかりにくいですね。
どう書けば分かりやすくなるんだろ(笑

補足日時:2002/12/18 12:58
    • good
    • 0

>>両者は'おなじもの'ではないかと


> 両者とは何を指しているのですか?

1. 挿入してその左右を見る
2. 普通の二分探索木ではだめなのでしょうか?

> ある瞬間に値を渡すとその値の両隣?の値が分かるようにしたいのです。

おっしゃることがわかりません。
'特定の値を持つnodeを二進木の中から探しだす'んじゃないんですか?
だったらアルゴリズムは'明らか'だと思いますが。
    • good
    • 0

あれ?



ソートされたデータ列に対する二分検索(binary-search) のことでしょうか?

それとも #1 のような二分木(binary-tree)の検索でしょうか?

この回答への補足

解答ありがとうございます

二分木による検索です。

二分木にある時点まで挿入を続け…
ある瞬間に値を渡すとその値の両隣?の値が分かるようにしたいのです。

補足日時:2002/12/18 11:55
    • good
    • 0

'普通の二分探索木'とは?



struct node {
int data;
struct node* left; // 左の枝
struct ndoe* right; // 右の枝
};

こんな奴? だったら両者は'おなじもの'ではないかと。

この回答への補足

解答ありがとうございます。

>こんな奴?
そうですこんな奴です


>両者は'おなじもの'ではないかと
両者とは何を指しているのですか?

補足日時:2002/12/18 11:52
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!