如何获取常规Java树中所有祖先的列表

时间:2018-05-04 09:49:41

标签: java tree treenode ancestor

我有一个TreeNode类,它表示树中的节点和LinkedTree类。在这一个中,我想获得一个节点的每个祖先的列表。在每个节点中,我保存值,父节点和包含所有子节点的列表。因此,我应该能够获得节点中父节点的祖先列表,该节点的父节点等等。

我尝试了递归。以下是我的代码的两个版本:

版本1:

public List<Position<E>> ancestors(Position<E> p) throws 
InvalidPositionException {  
    if(invalidPosition(p)) {
        throw new InvalidPositionException("Position is not in the current 
        tree");
    }
    List<Position<E>> ancestors = new ArrayList<>();
    if(!isRoot(p)) {
        ancestors.add(((TreeNode<E>) p).getParent());
        ancestors(((TreeNode<E>) p).getParent());
    }
    return ancestors;
}

第2版:

public List<Position<E>> ancestors(Position<E> p) throws 
InvalidPositionException {
     List<Position<E>> ancestors = new ArrayList<>();
     if(isRoot(p)) {
        return ancestors;
    }

    for(Position<E> e : positions()) {
        ancestors.add(((TreeNode<E>) e).getParent());
        if(e.equals(p)) {
            ancestors(((TreeNode<E>) e).getParent());
        }
    }
    return ancestors;
}

2 个答案:

答案 0 :(得分:0)

对于您的版本1,您需要传递ancestors列表以及递归调用,或者将递归调用中返回的列表添加到当前列表中。

if(!isRoot(p)) {
    ancestors.add(((TreeNode<E>) p).getParent());

   //requires signature change and does not require a 'return' at the end of the method
    ancestors(((TreeNode<E>) p).getParent(), ancestors); 
}

或者

 if(!isRoot(p)) {
    ancestors.add(((TreeNode<E>) p).getParent());
   //Add the result of the recursive call to the current list
    ancestors.add(ancestors(((TreeNode<E>) p).getParent(), ancestors)); 
}
return ancestors;

如果没有看到positions()

的实施,很难评论您的第二个版本

答案 1 :(得分:0)

忽略ancestors()方法的返回值;你需要使用它们。

我建议你传递一个列表来代替,这样会更经济。这可能涉及重载方法的重载私有版本,以避免暴露这种列表参数的这种特殊需要。