我有一个Person类,我想创建一个树。这是Person类的contsructor。
public Person(String name, int age, char gender, Person c1, Person c2)
c1是左边的孩子,c2是右边的孩子。所以说我像这样创造三个人:
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);
所以在这里你说亚当是根节点,亚当的左边孩子是b,芭芭拉和他的右边c是卡尔,依此类推。
所以我想要做的是编写一个count方法,它计算包括this
在内的子项数。所以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();
}
我在纸上运行了好几次,它应该会得到正确的结果,但是当我实际运行它时,由于某些原因它会被一些原因关闭。
答案 0 :(得分:4)
结果是错误的,因为当一个子元素为空时返回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的答案来部分计算结果。
答案 1 :(得分:4)
如果其中一个孩子是0
,您的代码会返回null
。这是不正确的,因为您没有考虑其他孩子,或this
。计数应始终为>= 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
。
答案 2 :(得分:0)
private int count() {
return 1 + ((this.child1 != null) ? (this.child1.count()) : (0)) + ((this.child2 != null) ? (this.child2.count()) : (0));
}