Java树,以递归方式返回父节点

时间:2018-07-23 16:55:27

标签: java loops recursion tree

我正在做一些有关从树中返回父节点的任务。
树看起来像这样:

      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的节点。

有人可以指出递归或循环中缺少的内容吗?因为我不是很擅长。

1 个答案:

答案 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
}