深度优先遍历(DFS)
DFS算法,一种用于遍历树或图的算法,它会沿着树的深度遍历树的节点,当访问到不满足条件的时候,就会进行回溯,然后重复执行该操作,直到所有节点都被遍历完;
该图取自于malanlllll下列是对二叉搜索树(BSTree)的探究
//节点类型
class Node {
Node left;
Node right;
Object data;
private boolean visited = false;
public void add(Node p) {
if ((int) p.data < (int) this.data) {
if (this.left == null) {
this.left = p;
} else
this.left.add(p);
} else {
if (this.right == null)
this.right = p;
else
this.right.add(p);
}
}
public Node() {
}
public Node(Object p) {
data = p;
left=null;
right=null;
}
}
//树类型
class Tree{
private Node root;
public void add(Object p){
if(root==null){
root=new Node(p);
}
else{
root.add(new Node(p));
}
}
}
首先理解的是:如何沿着树的节点进行深度遍历;
- 树的节点本质上是一个地址
- 每一个节点都有它的子节点(也就是存放了子节点的地址)
- 将当前节点指向子节点就会进行深度遍历
这里用递归的方法实现DFS(代码短)
public void dfssearch(){
if(root==null)//当root为空 就没必要对树进行遍历
return;
else{
DfsSearch(root);
}
}
private void DfsSearch(Node node) {//node存放当前的节点
if (node.left != null)//先对左节点进行深度遍历
DfsSearch(node.left);
//直到左节点为Null
//就会输出当前节点的值
System.out.println(node.data);
//输出后就对右节点进行深度遍历
if (node.right != null)
DfsSearch(node.right);
//最后回溯返回到父节点
}
广度优先算法(BFS)
BFS算法,它会对树或图进行"逐层"的遍历,也就是层序遍历,相较于DFS算法而言,BFS它不会直接到末尾,而是到下一层之前,会将节点的所有兄弟节点遍历完之后,再进入下一层。
从这一个定义,不难发现进行BFS需要一个FIFO(先进先出)的数组,也就是队列,而在JAVA中LinkedList就符合这样的情况
public void bfsSearch(){
if(root==null)
return;
else{
BfsSearch();
}
}
private void BfsSearch(){
LinkedList queue=new LinkedList();
queue.add(root);//将根节点存放进队列中
while(!queue.isEmpty()){//只要队列不为空,也就是说没有对树遍历完成
Node cur=(Node) queue.removeFirst();//将队列移除的节点作为当前节点
System.out.println(cur.data);
//将子节点存放进队列
if(cur.left!=null)
queue.add(cur.left);
if(cur.right!=null)
queue.add(cur.right);
}
//主函数测试
public static void main(String[] args) {
Tree root=new Tree();
root.add(5);
root.add(3);
root.add(9);
root.add(4);
root.add(2);
root.add(8);
root.add(7);
}
这就是该树的结构
DFS算法结果
BFS算法的结果
总结
BFS用于搜索单一的最短路径,特点就是"搜到就是最优的解"
DFS用于查找所有的解,空间效率高,但不一定是最优解