ノードに左右の子がないかどうかをチェックすることで再帰的な葉の数を数える汎用アルゴリズムがあることは知っています。しかし、私は多相コードを使って同じコードを書いて、可能かどうかをチェックしたい、今は私が葉の状態をチェックしているが、その情報は現在のノードに完全に依存しない。条件を使用しないでバイナリツリーに葉を数える
import java.util.*;
import java.lang.*;
import java.io.*;
abstract class Tree {
abstract int count();
}
class Empty extends Tree {
public int count() {
return 0;
}
}
class NonEmpty extends Tree {
private final int val;
private final Tree left;
private final Tree right;
public NonEmpty(int val, Tree left, Tree right) {
this.val = val;
this.left = left;
this.right = right;
}
public int count() {
return left.count() + right.count();
}
}
public class Main {
public static void main(String[] args) throws java.lang.Exception {
Tree t = new NonEmpty(5, new Empty(), new Empty());
System.out.println(t.count()); // 0 but should be 1
}
}
Update 1の私は、私は多くの批判を得た私の同僚のいくつかでこのアイデアを議論し
、これは悪い考えですか?私の意見は私にはきれいだと感じている、私は他人の意見を聞きたい。
サブクラスを再編成することはできますか? Empty/NonEmptyではなくLeaf/Branchサブクラスを作成するのと同じですか? –
@friendlydogご自分のバージョンのコードで可能であることを私に示すことができれば、私は興味を持っていますが、このように実装できれば良いでしょう。 – CodeYogi
Rをルートとするいくつかのツリーの葉の数は、Rが葉である場合は1、Rの子の葉の数の合計です。このため、特定のノードがリーフかどうかを判断できる必要があります。これは、@friendlydogで提案されているように型を使って行うこともできますし、子のタイプをチェックする(空の両方)、子供の葉の総数をチェックすることもできます(合計0は葉であることを意味します)。 – moreON