2


1

ツリーの再帰を支援

Personクラスがあり、ツリーを作成したい。 これがPersonクラスの構成要素です。

public Person(String name, int age, char gender, Person c1, Person c2)

c1は左側の子、c2は右側の子です。 そして、次のように3つのPersonを作成するとします。

Person c = new Person("Carl", 50, 'M', null, f);

Person b = new Person("Barbara", 52, 'F', d, e);

Person a = new Person("Adam", 75, 'M', b, c);

したがって、ここで、Adamはルートノードであり、Adamの左の子はb、これはBarbara、右のcはCarlなどであると言います。

したがって、私がやりたいのは、「this」を含む子の数を数えるcountメソッドを書くことです。 したがって、a.count()は6を返します(Person fに子がない場合)。

そして、ここに私が持っているコードがあります:

public int count() // total person count including this object
{
    if(child1==null)
        return 0; //I tried return 1 for this too didnt work
    if (child2==null)
        return 0; //also tried 1 for this
    return 1+this.child1.count() +1+this.child2.count();
}

私はこれを数回紙の上で実行しましたが、正しい結果が得られるはずですが、実際に実行すると、何らかの理由で少しずれています。

3 Answer


4


子がnullであるときにノード自体または他の子をカウントすることを忘れて0を返すため、結果は間違っています。 リーフノード( child1 == null && child2 == null)の場合、とにかく1を返す必要があります。

何かのようなもの:

return 1 + (child1 == null ? 0 : child1.count()) + (child2 == null ? 0 : child2.count())

元のコードに従うと、次のようになります。

if (child1 == null && child2 == null)
  return 1;
else if (child1 == null)
  return 1 + child2.count();
else if (child2 == null)
  return 1 + child1.count();
else
  return 1 + child1.count() + child2.count();

しかしその場合、結果を部分的に計算するjjnguyの答えに固執すると言います。


4


子の1つが「null」の場合、コードは「0」を返します。 これは、他の子、つまり「this」を考慮していないため、正しくありません。 ツリーには常に少なくとも1つのノードがあるため、カウントは常に `> = 1`でなければなりません。

また、1人の子供が「null」であることがわかった場合、すぐに戻ることはできません。 他の子もカウントする必要があります(存在する場合)。

実装方法は次のとおりです。

public int count() // total person count including this object
{
    int count = 1; // we count this node as 1
    if (child1 != null) // if we have a left child, count its size
        count += child1.count();
    if (child2 != null) // if we have a right child, count its size
        count += child2.count()
    return count;
}

どちらかが「null」であっても、両方の子を考慮する必要があります。


0


private int count() {
    return 1 + ((this.child1 != null) ? (this.child1.count()) : (0)) + ((this.child2 != null) ? (this.child2.count()) : (0));
}