如何获取通用java树中所有祖先的列表

Posted

技术标签:

【中文标题】如何获取通用java树中所有祖先的列表【英文标题】:How to get a list of all ancestors in a general java tree 【发布时间】:2018-05-04 09:49:40 【问题描述】:

我有一个表示树中节点的 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;

【问题讨论】:

你没有提到这两个版本有什么问题。 两个版本都不起作用...我只是尝试了不同的方法。我不知道该怎么做 在 SO 中仅仅说不起作用并不是一个好问题。 请添加positions()方法的代码 【参考方案1】:

对于您的版本 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()的实现,很难评论你的第二个版本

【讨论】:

【参考方案2】:

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

我建议您传递一个要附加的列表,这样会更经济。这可能涉及递归方法的重载私有版本,以避免暴露对此类列表参数的特殊需求。

【讨论】:

以上是关于如何获取通用java树中所有祖先的列表的主要内容,如果未能解决你的问题,请参考以下文章

如何从特定节点获取树祖先列表?

如何找到从特定顶点开始的退化树中的所有等于路径?

如何获取决策树中的所有基尼指数?

如何使用java从firebase数据库中的列表中获取所有值?

如果不是树中的所有这些节点,Python会在二叉树中找到两个节点的最低共同祖先

如何在 Symfony2 中获取控制器的所有路由列表?