java - 广度优先搜索 - 遍历树 - 持续更新

目录

广度优先搜索算法(Breadth-First Search,BFS)

1、递归实现BFS遍历树

2、非递归实现BFS遍历树


树的定义参见:

https://blog.csdn.net/Longtermevolution/article/details/105395558


广度优先搜索算法(Breadth-First Search,BFS)

BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。

 

1、递归实现BFS遍历树

public static <V> void bfs(List<TreeNode<V>> children, int depth) {
    List<TreeNode<V>> thisChildren, allChildren = new ArrayList<>();
    for (TreeNode<V> child: children) {
        //打印节点值以及深度
        System.out.println(child.getValue().toString() + ",   " + depth);
        thisChildren = child.getChildList();
        if (thisChildren != null && thisChildren.size() > 0) {
            allChildren.addAll(thisChildren);
        }
    }
    if (allChildren.size() > 0)  {
        bfs(allChildren, depth + 1);
    }
}

 

自己想了好久没想出来,最后还是在网上搜到的算法。

 


2、非递归实现BFS遍历树

public static <V> void bfsNotRecursive(TreeNode<V> tree) {
    if (tree != null) {
        //使用 Map 也只是为了保存树的深度,没这个需要可以不用 Map
        Queue<Map<TreeNode<V>, Integer>> queue = new ArrayDeque<>();
        Map<TreeNode<V>, Integer> root = new HashMap<>();
        root.put(tree, 0);
        queue.offer(root);
        while (!queue.isEmpty()) {
            Map<TreeNode<V>, Integer> itemMap = queue.poll();
            TreeNode<V> itemTreeNode = itemMap.keySet().iterator().next();
            int depth = itemMap.get(itemTreeNode);
            //打印节点值以及深度
            System.out.println(itemTreeNode.getValue().toString() + ",   " + depth);
            if (itemTreeNode.getChildList() != null &&
                    !itemTreeNode.getChildList().isEmpty()) {
                for (TreeNode<V> child : itemTreeNode.getChildList()) {
                    Map<TreeNode<V>, Integer> map = new HashMap<>();
                    map.put(child, depth + 1);
                    queue.offer(map);
                }
            }
        }
    }
}

相比较而言,非递归实现就比较简单了。可以看到非递归实现有个问题就是无法遍历根节点,不过问题不大,而且我也还没想出来其他更优雅的办法来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值