广度优先搜索_广度优先搜索(BFS)

e5b452efdf0581e56cd8c7c346dbb4c4.png

广度优先搜索(breadth-first search)可用于“图”这种数据结构中,查找最短路径。

树是一种特殊的图,二叉树是一种特殊的树。广度优先搜索常用于遍历二叉树,在这个遍历的过程中,需要用到队列这一先进先出(FIFO)的数据结构。

Queue<Node> queue = new LinkedList<>();

广度优先搜索是层级遍历,它依次遍历每一层的节点,并将该层所有节点的子节点添加到队列中,进行下一次遍历,直到遍历结束,队列为空

559. Maximum Depth of N-ary Tree

Loading...​leetcode.com
2caaff1e6f45b72fb2f698f8df4bfb22.png

给定一个树,找出这个树的最大深度。

class Solution 
{
    public int maxDepth(Node root) 
    {
        if(root == null)
        {
            return 0;
        }
        
        int maxDepth = 0;//用于记录最大深度
        Queue<Node> queue = new LinkedList<>();//队列
        queue.add(root);
        while(!queue.isEmpty())//直到队列为空,即,遍历完所有的节点
        {
            maxDepth++;//每遍历一层,计数+1
            int size = queue.size();//当前层节点的个数
            for(int i = 0; i < size; i++)
            {
                Node node = queue.poll();//poll()方法,取出队首节点
                if(node.children != null)//如果存在子节点,需要将子节点依次添加到队列中,用于下一层遍历
                {
                    List<Node> children = node.children;
                    for(Node child : children)
                    {
                        queue.add(child);
                    }
                }
            }
        }
        return maxDepth;
    }
}

111. Minimum Depth of Binary Tree

Loading...​leetcode.com
2caaff1e6f45b72fb2f698f8df4bfb22.png

给定一个二叉树,求出该二叉树的最小深度(没有子节点的节点,距离根节点的最小距离)。

class Solution 
{
    /**
    * 解法:BFS,遍历每一层,找出第一个没有左右子节点的节点,返回即可。
    */
    public int minDepth(TreeNode root) 
    {
        if(root == null)
        {
            return 0;
        }
        
        int minDepth = 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty())
        {
            int size = queue.size();
            minDepth++;
            for(int i = 0; i < size; i++)
            {
                TreeNode node = queue.poll();
                if(node.left == null && node.right == null)//该节点没有子节点
                {
                    return minDepth;
                }
                if(node.left != null)//左子节点不为空,添加到队列,进行下一层循环
                {
                    queue.add(node.left);
                }
                if(node.right != null)//右子节点不为空,添加到队列,进行下一层循环
                {
                    queue.add(node.right);
                }
            }
        }
        return minDepth;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值