You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现获取二叉树同一层级的所有子节点?

获取二叉树指定层级的所有节点

你好呀!你的思路方向是对的,但原代码的核心问题在于没有逐层更新要遍历的节点集合——你只初始化了根节点子节点的迭代器,后续循环里一直复用这个迭代器,自然没法深入到更深的层级。下面给你两种可行的实现思路,帮你解决这个问题:

方法一:递归实现

递归的逻辑很直观:如果目标层级是1,直接返回当前节点的子节点;如果层级大于1,就递归遍历当前节点所有子节点的「层级-1」层节点,最后把结果合并起来。

static Collection<ITreeNode<IProduct>> getOnLevel(ITree<IProduct> tree, int level) {
    // 边界处理:层级小于0返回空集合,层级为0返回根节点本身
    if (level < 0) {
        return new ArrayList<>();
    }
    if (level == 0) {
        Collection<ITreeNode<IProduct>> rootCollection = new ArrayList<>();
        rootCollection.add(tree.getRoot());
        return rootCollection;
    }
    // 调用递归方法处理子节点
    return getLevelNodes(tree.getRoot(), level);
}

private static Collection<ITreeNode<IProduct>> getLevelNodes(ITreeNode<IProduct> node, int remainingLevel) {
    Collection<ITreeNode<IProduct>> result = new ArrayList<>();
    // 剩余层级为1时,直接返回当前节点的所有子节点
    if (remainingLevel == 1) {
        return node.getChildren();
    }
    // 递归遍历所有子节点,寻找「剩余层级-1」的节点
    for (ITreeNode<IProduct> child : node.getChildren()) {
        result.addAll(getLevelNodes(child, remainingLevel - 1));
    }
    return result;
}

方法二:迭代式广度优先搜索(BFS)

如果担心递归会出现栈溢出(比如树的层级特别深),可以用迭代的BFS方式,逐层遍历节点,这种方式更适合处理深层级的树:

static Collection<ITreeNode<IProduct>> getOnLevel(ITree<IProduct> tree, int level) {
    // 边界处理
    if (level < 0) {
        return new ArrayList<>();
    }
    Queue<ITreeNode<IProduct>> queue = new LinkedList<>();
    queue.add(tree.getRoot());
    
    // 逐层往下遍历,直到到达目标层级
    for (int i = 0; i < level; i++) {
        int currentLevelSize = queue.size();
        // 如果当前层级没有节点(说明目标层级不存在),直接返回空集合
        if (currentLevelSize == 0) {
            return new ArrayList<>();
        }
        // 把当前层级的所有节点出队,将它们的子节点入队(作为下一层的遍历对象)
        for (int j = 0; j < currentLevelSize; j++) {
            ITreeNode<IProduct> currentNode = queue.poll();
            queue.addAll(currentNode.getChildren());
        }
    }
    // 循环结束后,队列里的就是目标层级的所有节点
    return new ArrayList<>(queue);
}

原代码问题复盘

你的原代码里,iterator只初始化了一次(指向根节点的子节点),后续循环中完全没有更新这个迭代器为下一层的节点集合。不管循环多少次i,都只会遍历根节点的子节点这一层,自然拿不到更深层级的节点。而上面两种方法都实现了「逐层递进」的逻辑,能准确找到目标层级的所有节点。

内容的提问来源于stack exchange,提问作者Amar Kalabić

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:32:49