图的创建以及遍历

用链表实现图结构,上代码:

public class GraphLink {
  public Node first;
  public Node last;

  public boolean isEmpty() {
    return first == null;
  }

  public void print() {
    Node current = first;
    while (current != null) {
      System.out.print("[" + current.x + "]");
      current = current.next;
    }
    System.out.println();
  }

  public void insert(int x) {
    Node newNode = new Node(x);
    if (this.isEmpty()) {
      first = newNode;
      last = newNode;
    } else {
      last.next = newNode;
      last = newNode;
    }
  }
}

class Node {
  int x;
  Node next;

  public Node(int x) {
    this.x = x;
    this.next = null;
  }
}

 

 

图的遍历方式有两种:先深后广,先广后深。

这里很巧妙的运用了栈和队列这两种数据结构,栈是先进后出,队列是先进先出。

先深后广,用的是栈;

先广后深,用的是队列;

也可以叫:深度优先搜索DFS(Deep First Search)、广度优先搜索BFS(Breath First Search)。

下面我举个例子:

比如有如下一个图:

 

 

先深后广法:

步骤01:以顶点1为起点,将相邻的顶点2和顶点5压入堆栈。
⑤|②

步骤02:弹出顶点2,将与顶点2相邻且未访问过的顶点3和顶点4压入堆栈。

⑤|④|③

步骤03:弹出顶点3,将与顶点3相邻且未访问过的顶点4和顶点5压入堆栈。

⑤④|⑤|④

步骤04:弹出顶点4,将与顶点4相邻且未访问过的顶点5压入堆栈。

⑤④|⑤|⑤

步骤05:弹出顶点5,将与顶点5相邻且未访问过的顶点压入堆栈,大家可以发现与顶点5相邻的顶点全部被访问过了,所以无须再压入堆栈。

⑤|④|⑤

步嘘06:将堆栈内的值弹出并判断是否已经遍历过了,直到堆栈内无节点可遍历为止。


深度优先的遍历顺序为顶点1、顶点2、顶点3、顶点4、顶点5。

 

 

先广后深法:

步骤01:以顶点1为起点,将与顶点1相邻且未访问过的顶点2和顶点5加入队列。

②|⑤

步骤02:取出顶点2,将与顶点2相邻且未访问过的顶点3和顶点4加入队列。

⑤|③|④

步骤03:取出顶点5,将与顶点5相邻且未访问过的顶点3和顶点4加入队列。

③④|③|④

步骤04:取出顶点3,将与顶点3相邻且未访问过的顶点4加入队列。

④③|③|④

步骤05:取出顶点4,将与顶点4相邻且未访问过的顶点加入队列中,大家可以发现与顶点4相邻的顶点全部被访问过了,所以无须再加入队列中。

③④②④

步骤06:将队列内的值取出并判断是否已经遍历过了,直到队列内无节点可遍历为止。


广度优先的遍历顺序为顶点1、顶点2、顶点5、顶点3、顶点4。

posted @ 2021-12-29 16:03  hucat  阅读(131)  评论(0)    收藏  举报