我有一个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;
}
答案 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()方法的返回值;你需要使用它们。
我建议你传递一个列表来代替,这样会更经济。这可能涉及重载方法的重载私有版本,以避免暴露这种列表参数的这种特殊需要。