java 实现图的宽度优先遍历

与Graph相关的问题主要集中在深度优先搜索和宽度优先搜索。深度优先搜索非常简单,你可以从根节点开始循环整个邻居节点。下面是一个非常简单的宽度优先搜索例子,核心是用队列去存储节点。

                                 这里写图片描述

代码如下:

package sort;

//第一步,定义一个GraphNode
class GraphNode{
    int val;
    GraphNode next;
    GraphNode[] neighbors;
    boolean visited;

    GraphNode(int x){
        val = x;
    }

    GraphNode(int x,GraphNode[] n){
        val = x;
        neighbors = n;
    }

    public String toString(){
        return "value:"+this.val;
    }
}

//第二步,定义一个队列
class Queue{
    GraphNode first,last;
    public void enqueue(GraphNode n){
        if(first == null){
            first = n;
            last = first;
        }else{
            last.next = n;
            last = n;
        }
    }

    public GraphNode dequeue(){
        if(first == null){
            return null;
        }else{
            GraphNode temp = new GraphNode(first.val,first.neighbors);
            first = first.next;
            return temp;
        }
    }
}
//第三步,使用队列进行宽度优先搜索 
public class GraphTest {
    public static void main(String[] args) {
        GraphNode n1 = new GraphNode(1);
        GraphNode n2 = new GraphNode(2);
        GraphNode n3 = new GraphNode(3);
        GraphNode n4 = new GraphNode(4);
        GraphNode n5 = new GraphNode(5);

        n1.neighbors = new GraphNode[]{n2,n3,n5};
        n2.neighbors = new GraphNode[]{n1,n4};
        n3.neighbors = new GraphNode[]{n1,n4,n5};
        n4.neighbors = new GraphNode[]{n2,n3,n5};
        n5.neighbors = new GraphNode[]{n1,n3,n4};

        breathFirstSearch(n1,5);
    }

    public static void breathFirstSearch(GraphNode root,int x){
        if(root.val == x){
            System.out.println("find in root");
        }

        Queue queue = new Queue();
        root.visited = true;
        queue.enqueue(root);

        while(queue.first!=null){
            GraphNode c = (GraphNode)queue.dequeue();
            for(GraphNode n:c.neighbors){
                if(!n.visited){
                    System.out.println(n+" ");
                    n.visited = true;
                    if(n.val==x){
                        System.out.println("Find "+n);
                    }
                    queue.enqueue(n);
                }
            }
        }
    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值