こんにちは 私は{23,16,45,26,2,5,9}
のようにそれにいくつかの数字を持つ配列のリストを持っていると私は、この配列リストとバイナリ検索ツリーを作りたい"array"
とその要素が持つオブジェクトである2
フィールド、1)digit2)level
けどここで私はちょうどそのdigit
フィールドを使用したい。dList
はDoublyLinkedList
です。 これは私のコードですが、例外が発生しました。二分探索木
private void method(ArrayList<Element> array) {
DNode header = new DNode(null, null, null);
DNode trailer = new DNode(null, header, null);
header.next = trailer;
DNode node = new DNode(array.get(0), header, trailer);
dList.addLast(node);
header = node
for(int i = 1;i<array.size();i++){
makeBST(node, array.get(i));
}
}
private void makeBST(DNode node, Element e) {
if (!e.equals(node.getElement())) {
DNode nodeOne = new DNode(e, null, null);
if (node.getElement().getDigit() > e.getDigit()) {
node.prev = nodeOne;
} else if (node.getElement().getDigit() < e.getDigit()) {
node.next = node;
}
}
if (e.getDigit() < node.getElement().getDigit()) {
makeBST(node.prev, e);
}
makeBST(node.next, e);
}
例外:
Exception in thread "main" java.lang.StackOverflowError
at OBST.GreedyVersion.makeBST(GreedyVersion.java:43)
at OBST.GreedyVersion.makeBST(GreedyVersion.java:54)
at OBST.GreedyVersion.makeBST(GreedyVersion.java:54)
at OBST.GreedyVersion.makeBST(GreedyVersion.java:54)
例外の最初の行のコード行のためである:
if (!e.equals(node.getElement()))
どのように再帰呼び出しを終了できますか? – user472221
最初のifブロックの最後に "return"が必要だと思います。あるいは、同じ結果で、再帰的なmakeBST呼び出しを適切な "else if"ブロックに入れることができます。 – TToni
@ user472221、TToniとiirekmは正しいです。再帰的終了条件の場合、再帰がいつ停止する必要があるかを考えなければなりません(ヒント:サイズ0またはサイズ1のツリーがあるとどうなりますか?)、その条件が満たされたら、関数自身を呼び出すことをやめます。 – Assaf