在Android开发中,有时候会遇到多层级列表的显示,如下图,可用RecyclerView实现。
其数据源的数据结构是一种树状结构,如下图:
现在有两种方法来遍历这种数据结构。
深度优先搜索
其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
举例说明之:据上图,我们从A点开始发起深度优先搜索,则可能得到如下的访问过程:A→B→E,没有路了,回溯到B;→F,没有路了,回溯到B;→G,没有路了,回溯到A;→C→H等等。
全过程:A→B→E→F→G→C→H→D→I→J
深度优先遍历各个节点,需要使用到栈(Stack)这种数据结构。栈的特点是是先进后出。代码实现:
public static void depthFirstSearch(List<TreeNode> data) {
Stack<TreeNode> nodeStack = new Stack<TreeNode>();
for (TreeNode item : data) {
nodeStack.push(item);
while (!nodeStack.isEmpty()) {
TreeNode node = nodeStack.pop();
System.out.println(node);
//获取节点的子节点
List<TreeNode> treeNodes = node.childs;
if (treeNodes != null && treeNodes.size() > 0) {
for (TreeNode child : treeNodes) {
nodeStack.push(child);
}
}
}
}
}
广度优先搜索
其过程简要来说是对每一层节点依次访问,访问完一层再进入下一层,而且每个节点只能访问一次。
举例说明之:据上图,我们从A点开始发起广度优先搜索,则可能得到如下的访问过程:A,访问完第一层了,接着访问第二层B→C→D,访问完第二层,接着第三层E→F→G→H→I→J。
全过程:A→B→C→D→E→F→G→H→I→J
广度优先遍历各个节点,需要使用到队列(Queue)这种数据结构,队列的特点是先进先出。代码实现:
public static void breadthFirstSearch(List<TreeNode> data) {
Deque<TreeNode> nodeDeque = new ArrayDeque<>(data);
while (!nodeDeque.isEmpty()) {
TreeNode node = nodeDeque.pollFirst();
System.out.println(node);
//获取节点的子节点
List<TreeNode> treeNodes = node.childs;
if (treeNodes != null && treeNodes.size() > 0) {
nodeDeque.addAll(treeNodes);
}
}
}