From cb153df53464652d0468d75da809e5df19655148 Mon Sep 17 00:00:00 2001 From: elasticsearch <10085871+easy-es@user.noreply.gitee.com> Date: Tue, 9 Aug 2022 09:38:36 +0000 Subject: [PATCH] =?UTF-8?q?update=20hutool-core/src/main/java/cn/hutool/co?= =?UTF-8?q?re/tree/TreeUtil.java.=20=E4=B8=B0=E5=AF=8C=E5=8E=9F=E6=A0=91?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E5=8A=9F=E8=83=BD=201.=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=A3=AE=E6=9E=97=E7=9A=84=E5=B9=BF=E5=BA=A6=E4=BC=98?= =?UTF-8?q?=E5=85=88=E5=8F=8A=E6=B7=B1=E5=BA=A6=E4=BC=98=E5=85=88=E9=81=8D?= =?UTF-8?q?=E5=8E=86=E6=96=B9=E6=B3=95=202.=E6=96=B0=E5=A2=9E=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E5=B9=BF=E5=BA=A6=E4=BC=98=E5=85=88=E7=BA=A7=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6=E4=BC=98=E5=85=88=E9=81=8D=E5=8E=86=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/tree/TreeUtil.java | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/tree/TreeUtil.java b/hutool-core/src/main/java/cn/hutool/core/tree/TreeUtil.java index 9c1dd2748..5e1f5ce32 100644 --- a/hutool-core/src/main/java/cn/hutool/core/tree/TreeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/tree/TreeUtil.java @@ -236,4 +236,88 @@ public class TreeUtil { public static Tree createEmptyNode(final E id) { return new Tree().setId(id); } + + /** + * 深度优先,遍历森林,将森林转换为数组 + * + * @param forest 森林 + * @param 节点ID类型 + * @return 森林所有节点列表 + */ + public static List> deepFirstForestConvertToList(List> forest) { + if (CollectionUtil.isEmpty(forest)) { + return null; + } + List> list = new ArrayList<>(); + forest.forEach(root -> list.addAll(Objects.requireNonNull(deepFirstTreeConvertToList(root)))); + return list; + } + + /** + * 广度优先,遍历森林,将森林转换为数组 + * + * @param forest 森林 + * @param 节点ID类型 + * @return 森林所有节点列表 + */ + public static List> broadFirstForestConvertToList(List> forest) { + if (CollectionUtil.isEmpty(forest)) { + return null; + } + List> list = new ArrayList<>(); + forest.forEach(root -> list.addAll(Objects.requireNonNull(broadFirstTreeConvertToList(root)))); + return list; + } + + + /** + * 深度优先,遍历树,将树换为数组 + * + * @param root 树的根节点 + * @param 节点ID类型 + * @return 树所有节点列表 + */ + public static List> deepFirstTreeConvertToList(Tree root) { + if (Objects.isNull(root)) { + return null; + } + + // 入栈,FILO + List> list = new ArrayList<>(); + Stack> stack = new Stack<>(); + stack.add(root); + while (!stack.isEmpty()) { + Tree node = stack.pop(); + list.add(node); + if (node.hasChild()) { + node.getChildren().forEach(stack::push); + } + } + return list; + } + + /** + * 深度优先,遍历树,将树转换为数组 + * + * @param root 树的根节点 + * @param 节点ID类型 + * @return 树所有节点列表 + */ + public static List> broadFirstTreeConvertToList(Tree root) { + if (Objects.isNull(root)) { + return null; + } + + // 加入FIFO队列 + List> list = new ArrayList<>(); + Queue> queue = new LinkedList<>(); + queue.offer(root); + while (!queue.isEmpty()) { + Tree node = queue.poll(); + if (node.hasChild()) { + node.getChildren().forEach(queue::offer); + } + } + return list; + } }