!748 丰富原树工具类功能

Merge pull request !748 from elasticsearch/v6-dev
This commit is contained in:
Looly 2022-08-09 14:20:52 +00:00 committed by Gitee
commit fb285ed20b
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F

View File

@ -236,4 +236,89 @@ public class TreeUtil {
public static <E> Tree<E> createEmptyNode(final E id) {
return new Tree<E>().setId(id);
}
/**
* 深度优先,遍历森林,将森林转换为数组
*
* @param forest 森林
* @param <E> 节点ID类型
* @return 森林所有节点列表
*/
public static <E> List<Tree<E>> deepFirstForestConvertToList(List<Tree<E>> forest) {
if (CollectionUtil.isEmpty(forest)) {
return null;
}
List<Tree<E>> list = new ArrayList<>();
forest.forEach(root -> list.addAll(Objects.requireNonNull(deepFirstTreeConvertToList(root))));
return list;
}
/**
* 广度优先,遍历森林,将森林转换为数组
*
* @param forest 森林
* @param <E> 节点ID类型
* @return 森林所有节点列表
*/
public static <E> List<Tree<E>> broadFirstForestConvertToList(List<Tree<E>> forest) {
if (CollectionUtil.isEmpty(forest)) {
return null;
}
List<Tree<E>> list = new ArrayList<>();
forest.forEach(root -> list.addAll(Objects.requireNonNull(broadFirstTreeConvertToList(root))));
return list;
}
/**
* 深度优先,遍历树,将树换为数组
*
* @param root 树的根节点
* @param <E> 节点ID类型
* @return 树所有节点列表
*/
public static <E> List<Tree<E>> deepFirstTreeConvertToList(Tree<E> root) {
if (Objects.isNull(root)) {
return null;
}
// 入栈,FILO
List<Tree<E>> list = new ArrayList<>();
Stack<Tree<E>> stack = new Stack<>();
stack.add(root);
while (!stack.isEmpty()) {
Tree<E> node = stack.pop();
list.add(node);
if (node.hasChild()) {
node.getChildren().forEach(stack::push);
}
}
return list;
}
/**
* 深度优先,遍历树,将树转换为数组
*
* @param root 树的根节点
* @param <E> 节点ID类型
* @return 树所有节点列表
*/
public static <E> List<Tree<E>> broadFirstTreeConvertToList(Tree<E> root) {
if (Objects.isNull(root)) {
return null;
}
// 加入FIFO队列
List<Tree<E>> list = new ArrayList<>();
Queue<Tree<E>> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Tree<E> node = queue.poll();
list.add(node);
if (node.hasChild()) {
node.getChildren().forEach(queue::offer);
}
}
return list;
}
}