【问题标题】:Getting all children on same level of binary tree让所有孩子都在同一级别的二叉树上
【发布时间】:2020-02-20 21:36:40
【问题描述】:

我想在同一级别的树上显示所有孩子。所以如果我有一棵这样的树:

            A
   B        C        D
 E   F    G   H    I   J

例如,级别 3 将返回 E、F、G、H、I 和 J 节点。我在TreeNode 类中有一个方法,它返回给定节点的所有子节点,所以我想这样做:

static Collection<ITreeNode<IProduct>> getOnLevel(ITree<IProduct> tree, int level)
{
    Collection<ITreeNode<IProduct>> temp;
    int i;
    Iterator<ITreeNode<IProduct>> iterator = tree.getRoot().getChildren().iterator();
    for(i=0; i<=(level); i++) 
    {       
        while(iterator.hasNext())
        {                   
            ITreeNode<IProduct> elem = iterator.next();
            if(i == (level)) 
            {
                temp = elem.getChildren();
                return temp;
            }
        }
    }
    return tree.getRoot().getChildren(); 

}

但后来我意识到我只是遍历第一级孩子,所以我可能不得不以某种方式递归地做到这一点? 提前致谢,阿马尔!

【问题讨论】:

  • 对树进行 BFS 遍历。
  • @NiVeR 是的,我理解二叉树上 BFS 遍历的概念,但是如果树可以有多个孩子,而不仅仅是两个,它会是什么样子?如果它是一棵二叉树,我可以轻松地递归调用两次相同的函数,但是如果有更多的孩子,我该怎么做?

标签: java tree iterator treenode


【解决方案1】:

您可以递归或迭代,这取决于您。

我发现递归解决方案更容易阅读。它看起来像这样:

static Collection<ITreeNode<IProduct>> getOnLevel(
    ITree<IProduct> tree
,   int desiredLevel
) {
    List<ITreeNode<IProduct>> result = new ArrayList<>();
    findOneLevel(tree.getRoot(), desiredLevel, 0, result);
    return result;
}

static void findOnLevel(
    ITreeNode<IProduct> node
,   int desiredLevel
,   int currentLevel
,   List<ITreeNode<IProduct>> result
) {
    if (currentLevel == desiredLevel) {
        result.add(node);
        return;
    }
    Iterator<ITreeNode<IProduct>> iterator = node.getChildren().iterator();
    while(iterator.hasNext()) {
       findOnLevel(iterator.next(), desiredLevel, currentLevel+1, result);
    }
}

该方法非常简单:顶级方法创建一个列表来存储结果,并调用递归findOnLevel。递归方法检查我们是否达到了所需的级别,如果达到了,则将当前节点添加到结果中。否则,我们会在递归调用中遍历当前节点的所有子节点,将 currentLevel+1 传递给新的当前级别。

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2020-01-08
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多