Breadth-first Search(广度优先搜索)专题1

广度优先搜索的定义
广度优先搜索BFS类似于树的层次遍历算法。基本思想是:首先访问顶点v,然后由v出发,依次访问v的各个未被访问过的顶点w1,w2,w3…wn。然后再访问wi(wi是w1,w2,w3…wn中的一个)未被访问过的邻接点。以此类推,直到所有的顶点都被访问过。BFS是一种分层查找的过程,每向前一步就访问一批顶点。不同于深度优先搜索那样有回退的情况。为了实现算法,需要借助于一个辅助队列并且以非递归的形式来实现。(来自网页

559. Maximum Depth of N-ary Tree

在这里插入图片描述

思路:对于上面这棵树,BFS与DFS遍历节点顺序不同。
BFS: 1 3 2 4 5 6
DFS: 1. 3 5 6 2 4
代码

107. Binary Tree Level Order Traversal II

BFS使用queue实现非递归,是有一个模板的。

public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> levelTraversal = new ArrayList<List<Integer>>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if(root!=null){
            queue.add(root);
        }
        while(!queue.isEmpty()){
            int size = queue.size();//长度
            List<Integer> level = new ArrayList<Integer>();
            for(int i=0;i<size;i++){//遍历本次元素
                TreeNode node = queue.poll();
                level.add(node.val);//做事情
                //添加子节点
                if(node.left!=null) queue.add(node.left);
                if(node.right!=null) queue.add(node.right);
            }
            levelTraversal.add(0,level);
        }
        return levelTraversal;
    }

这道题目也可以使用递归版,不过使用的有点勉强.

 public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> levelTraversal = new ArrayList<List<Integer>>();
        levelMaker(root, levelTraversal, 0);
        return levelTraversal;
    }

    private void levelMaker(TreeNode node, List<List<Integer>> result, int level) {
        if (node == null) return;
        if (result.size() <= level) {
            result.add(0, new ArrayList<Integer>());
        }
        result.get(result.size() - 1 - level).add(node.val);
        levelMaker(node.left, result, level + 1);
        levelMaker(node.right, result, level + 1);
    }

代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值