我正在做一些有关从树中返回父节点的任务。
树看起来像这样:
1
/ \
2 3
/ /
4 5
/ \
6 7
类节点没有可以返回父节点的方法,这有一些限制。因此,我们需要创建自己的方法来获取父节点。这是我的方法:
public Node getParentNode(int idChild, Node pParent) {
List<Node> child;
List<Node> gChild;
if (pParent == null)
{
child = root.getChildren();
} else {
child = pParent.getChildren();
}
Node nParent = null;
if (child != null) {
for (Node c : child) {
if (c.getId() == idChild) {
nParent = c;
break;
} else {
return getParentNode(idChild, c);
}
}
}
return nParent;
}
以某种方式可以检索ID为4的节点的父节点,也就是ID为2的节点。但是,当检索ID为5、6和7的节点的父节点时,它不起作用。因此,基本上它仅适用于ID为2、3和4的节点。
有人可以指出递归或循环中缺少的内容吗?因为我不是很擅长。
答案 0 :(得分:2)
问题在这里
return getParentNode(idChild, c);
您不应仅按原样返回此调用的结果。如果要搜索的节点不在该子树中,该怎么办。您应该只在返回非空结果时返回(否则 for 循环不会循环到下一个子节点)
仅在递归调用中找到父节点时返回。
此外,if
块中的return语句中有一个错误。您应该返回对父节点而不是当前子节点的引用。
{
....
if (child != null) {
for (Node c : child) {
gChild = c.getChildren(); //Btw this is just dead store
if (c.getId() == idChild) {
return pParent; //You want to return the parent not the current node.
} else {
nParent = getParentNode(idChild, c);
if (nParent != null) {
return nParent;
}
}
}
}
return null; //Node (idChild) not found in this subtree
}