Java 树的遍历-深度优先(DFS)与广度优先搜索(BFS)递归版与非递归版

介绍

最近系统学习算法时发现网上关于这两种算法的文章参差不齐,不太统一,自己也花了点时间总结了一下,现在在这里分享出来。

树的实现

树是一种特殊的有向图,实现方式有很多,我这里用最常见也是最简单的方式来实现:

public class TreeNode<V> {
   

    private V value;
    private List<TreeNode<V>> childList;//子节点列表

    public TreeNode(V value) {
   
        this.value = value;
    }

    public TreeNode(V value, List<TreeNode<V>> childList) {
   
        this.value = value;
        this.childList = childList;
    }

    public V getValue() {
   
        return value;
    }

    public void setValue(V value) {
   
        this.value = value;
    }

    public List<TreeNode<V>> getChildList() {
   
        return childList;
    }

    public void setChildList(List<TreeNode<V>> childList) {
   
        this.childList = childList;
    }
}

下面基于这种方式实现的树来编写这两种遍历算法。

树的两种遍历算法

关于这两种算法的介绍分析网上实在是太多了,我就不详细说了,直接放代码。

深度优先搜索算法(DFS)

深度优先搜索算法是指沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。

递归实现

public static <V> void dfs(TreeNode<V> tree, int depth) {
   
    if (tree != null) {
   
        //打印节点值以及深度
        System.out.println(tree.getValue().toString() + ",   " + depth);
        if (tree.getChildList() != null && !tree.getChildList().isEmpty()) {
   
            for (TreeNode<V> item : tree.getChildList()) {
   
                dfs(item, depth 

你可能感兴趣的:(android开发,算法,数据结构,树,android,java)