树搜索:深度优先和广度优先

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zengd0/article/details/80229134

在Android开发中,有时候会遇到多层级列表的显示,如下图,可用RecyclerView实现。

image

其数据源的数据结构是一种树状结构,如下图:

image

现在有两种方法来遍历这种数据结构。

深度优先搜索

其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

举例说明之:据上图,我们从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);
            }

        }
    }

猜你喜欢

转载自blog.csdn.net/zengd0/article/details/80229134
今日推荐