如何实现获取二叉树同一层级的所有子节点?
获取二叉树指定层级的所有节点
你好呀!你的思路方向是对的,但原代码的核心问题在于没有逐层更新要遍历的节点集合——你只初始化了根节点子节点的迭代器,后续循环里一直复用这个迭代器,自然没法深入到更深的层级。下面给你两种可行的实现思路,帮你解决这个问题:
方法一:递归实现
递归的逻辑很直观:如果目标层级是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ć
相关产品推荐
相关产品推荐

