
Binary Search Tree(=二分探索木)のheight(高さ?)を見つけるメソッドを作りたいのですが、
そのアルゴリズムが頭にうまく浮かびません。
まず思いついたのは一つ一つのNode(=ノード)をそれぞれのLeaf(=リーフ、葉?)まで辿っていって
それらのheightを全部記憶させておいて後で比較するという…最も原始的な方法です。
しかし、Treeの大きさも未知なので用意する変数の数も未知になって
どう考えても不適当でしょう(当たり前か(^^ゞ)。
Recursion(=再帰)を使えばいいのでしょうか?
そうだとしてもどうすればいいのか…。
アルゴリズムがパッと浮かぶ方、どうか教えて下さい。
No.2ベストアンサー
- 回答日時:
再帰を使うとすれば、二分木ですから、直下の二つだけ比較すれば良いです。
大きい方を採って、自分自身の分1をプラスして上に返したら、上は上で判断してくれます。
出来ました!
どのくらいの出来なのか自分でもよく分かりませんが一応動くのでよしとします。
問題は組んだ本人がいまいち動作を理解してないことですね(^_^.)
ありがとうございました!
public int height() {
return height(root, 0);
}
public int height(IntBSTNode p, int h) {
if (p != null && p.right != null && p.left != null) {
if (p.left.key < p.right.key)
return height(p.right, h+1);
else
return height(p.left, h+1);
}
return h;
}
No.1
- 回答日時:
全部のheightを記憶しなくても、
最大の一個だけ記憶しておいて、
それより大きいのが見つかったときだけ書き換えたらいいじゃないですか。
「現在の高さ(深さ)」が調べにくければ、
treeを操作するとき、rootの0から始まって、
葉の方に行けば+1、根の方に戻れば-1とすればいいでしょう。
そうですね、最大の一個だけ記憶しておけばよかったのですね。
それでPreorder Traversalメソッドを修正して組んでみました。
…すみません、完結できませんでした。
葉の方に行けば+1、は出来たのですが、
根の方に戻れば-1、は戻るタイミングが分かりませんでした。
Stackを使っているのでPopのすぐ後だと思ったのですが…。
BreadthFirstとか使えばよかったのかも…すみません、脳が足りませんでした。
public int iterativePreorderHeight() {
int max = 0, h = 0;
IntBSTNode p = root;
Stack travStack = new Stack();
if (p != null) {
travStack.push(p);
while (!travStack.isEmpty()) {
p = (IntBSTNode) travStack.pop();
// h--; この位置だとhが1以上の値になりません
p.visit();
if (p.right != null) {
travStack.push(p.right);
h++;
}
if (p.left != null) { // left child pushed after right
travStack.push(p.left); // to be on the top of the stack;
h++;
}
if (h > max)
max = h;
}
}
return max;
}
それと前回、回答して頂いた二項係数の再帰的計算メソッドを一応載せておきますね
(お礼を差し上げた10分後に完成しました)。
//biRec() method: computes the binomial coeffient recursively
public int biRec(int n, int k) {
if (k == 0 || k == n)
return 1;
else
return biRec(n-1,k-1) + biRec(n-1,k);
}
もっともっと勉強します(特に数学)。
重ね重ね、ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 数学 特定の座標点を通る回帰を行う方法について。 2 2022/10/10 10:27
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- 英語 英文解釈を教えてください。 3 2023/07/10 13:57
- その他(スマホアプリ・スマホゲーム) 十七歳未満でも使用できる検索アプリを探しています。 4 2022/05/19 23:45
- ホラー・ミステリー ある邦画ホラー映画を探しています 1 2022/07/19 14:12
- 計算機科学 これは迷路を解くというよりも、いかに速く最速で走り切れる経路を見出せるかや、マシン性能、プログラミン 3 2023/07/17 16:27
- その他(メンタルヘルス) 成人用(男女共用又は女性用)おむつを探しています。 探し始めて間もないので(パンツタイプを主に見てい 2 2023/02/28 19:25
- その他(プログラミング・Web制作) プログラミングの能力とアルゴリズムの能力は別物だと言われたのですが、これは本当ですか? プログラミン 1 2023/03/09 02:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
エクセルのマクロでプリンタを...
-
VB6と2008、SQL使用方法の違い...
-
ここで言う「アロー演算子」の...
-
Labelコントロールに数字を代入...
-
JSPで<SELECT>の中にDBから持っ...
-
worksheets & rows メソッドは...
-
VBPをダブルクリックするとたま...
-
Excel VBA でExcelを終了したい...
-
処理内容がほぼ同じメソッドの...
-
VBAでSaveAs使用し、指定してい...
-
DAOのExcelVBAにてAccessのデー...
-
FEM解析の読み方は?
-
VBA/FIND関数を使っての先頭文...
-
初心者のAndroid学習について
-
ShellExecuteってなんで関数?
-
エクセルVBAで、ユーザーフォー...
-
エクセルVBAにおけるON TIMEメ...
-
CALLされていないメソッドを見...
-
[objective-c]他クラスのメソッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
ウィンドウを最前面にできません
-
コマンドプロンプト実行後に画...
-
VBPをダブルクリックするとたま...
-
【sendkeysメソッドが動かずに...
-
final修飾子を使っているのに、...
-
Application.Wait の参照設定
-
javascriptからjavaを呼び出したい
-
VBA コピーが出来ません…!
-
Excel VBA でExcelを終了したい...
-
エクセルVBAにおけるON TIMEメ...
-
JSPで<SELECT>の中にDBから持っ...
-
Labelコントロールに数字を代入...
-
boolean型のフィールドとゲッタ...
-
eclipse-Tomcatでのデバッグに...
-
C#.net Define文
-
[VBA]GetSaveAsFilenameメソッ...
-
CALLされていないメソッドを見...
-
エクセルのマクロでプリンタを...
おすすめ情報