
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
mainメソッドのthrows節で設定...
-
【sendkeysメソッドが動かずに...
-
VBPをダブルクリックするとたま...
-
for文(拡張)内の変数(ローカ...
-
CALLされていないメソッドを見...
-
配列のメソッド
-
エクセルVBAにおけるON TIMEメ...
-
VB.NETでのEXCELファイルの閉じ方
-
DataGridViewでセルクリックイ...
-
class Test_A { main(){}}...
-
プリンター設定
-
『増加する』メソッド名は?
-
c++ CLI 文字列検索について
-
JSPで<SELECT>の中にDBから持っ...
-
Application.Wait の参照設定
-
C#の動的キャスト
-
ウィンドウを最前面にできません
-
VBAでSaveAs使用し、指定してい...
-
VBからExcelのデータを並べ替え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
【sendkeysメソッドが動かずに...
-
コマンドプロンプト実行後に画...
-
VBA コピーが出来ません…!
-
ウィンドウを最前面にできません
-
JSPで<SELECT>の中にDBから持っ...
-
javascriptからjavaを呼び出したい
-
VBPをダブルクリックするとたま...
-
eclipse-Tomcatでのデバッグに...
-
Application.Wait の参照設定
-
エクセルVBAにおけるON TIMEメ...
-
配列のメソッド
-
エクセルのマクロでプリンタを...
-
final修飾子を使っているのに、...
-
drawStringで文字間隔の調整
-
Excel VBA でExcelを終了したい...
-
worksheets & rows メソッドは...
-
CALLされていないメソッドを見...
-
vbaエクセルマクロ RemoveDupli...
おすすめ情報