我有一个看起来像树的数据结构:
A -> A
-> A
-> A -> A -> A
-> A
-> A
-> A
基本上A
可以由另一个A
或多个A(s)
组成。
我想找一个带有ID的特定A
。
public A findParticularA(int id)
{
if(this.getID == id)
{
return this;
}
else
findAHelper(this, id);
}
public A findAHelper(A root, int id)
{
for(A a : root.getChildren())
{
if(a.getID == id)
return a;
else
findAHelper(a, id);
}
return null;
}
这仅适用于我正在寻找的A
正好在第一个根A
之后。
A -> A
-> **A** will be found
但是如果我想在树中更深的A
那么它将无法工作。这是因为我没有正确回归。请帮忙。
答案 0 :(得分:2)
您需要在findParticularA
中返回findAHelper的结果。
在findAHelper
中,循环使你深入到树的三个分支;希望A会从这些分支中恢复,但它不会从所有分支中回来,只有一个。其余的(或全部)将返回null。
所以你需要捕获findAHelper的返回值,看看它是否为null,以决定是否返回它 - 如果它是A(非空),则返回它,否则不要#39; t让循环继续下一个树枝。
我无法在Java中正确地编写它,但我建议的更改是:
public A findParticularA(int id)
{
if (this.getID == id)
{
return this;
}
else
{
return findAHelper(this, id); # here
}
}
public A findAHelper(A root, int id)
{
for(A a : root.getChildren())
{
if(a.getID == id)
{
return a;
}
else
{
tmp = findAHelper(a, id); # here
if (tmp is not null) { #
return tmp #
}
}
}
return null;
}
答案 1 :(得分:2)
您可以使用一种方法执行此操作。您不需要findParticularA
public A findA (A root, int id)
{
if (root.getID == id)
return root;
A[] children = root.getChildren();
A res = null;
for (int i = 0; res == null && i < children.length; i++)
{
res = findA(children[i], id);
}
return res;
}
只需拨打:
A a = findA(this, id);