您的位置:首页 > 其它

深度优先搜索与广度优先搜索

2015-10-28 11:05 260 查看
有两种常用的方法可用来搜索图:即深度优先搜索和广度优先搜索。它们最终都会到达所有连通的顶点。深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现。

深度优先搜索:

下面图中的数字显示了深度优先搜索顶点被访问的顺序。



为了实现深度优先搜索,首先选择一个起始顶点并需要遵守三个规则:

(1) 如果可能,访问一个邻接的未访问顶点,标记它,并把它放入栈中。

(2) 当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。

(3) 如果不能执行规则1和规则2,就完成了整个搜索过程。

广度优先搜索:

在深度优先搜索中,算法表现得好像要尽快地远离起始点似的。相反,在广度优先搜索中,算法好像要尽可能地靠近起始点。它首先访问起始顶点的所有邻接点,然后再访问较远的区域。它是用队列来实现的。

下面图中的数字显示了广度优先搜索顶点被访问的顺序。



实现广度优先搜索,也要遵守三个规则:

(1) 访问下一个未来访问的邻接点,这个顶点必须是当前顶点的邻接点,标记它,并把它插入到队列中。

(2) 如果因为已经没有未访问顶点而不能执行规则1时,那么从队列头取一个顶点,并使其成为当前顶点。

(3) 如果因为队列为空而不能执行规则2,则搜索结束。

这里以二叉树为例来实现。

import java.util.ArrayDeque;

public class BinaryTree {
static class TreeNode{
int value;
TreeNode left;
TreeNode right;

public TreeNode(int value){
this.value=value;
}
}

TreeNode root;

public BinaryTree(int[] array){
root=makeBinaryTreeByArray(array,1);
}

/**
* 采用递归的方式创建一颗二叉树
* 传入的是二叉树的数组表示法
* 构造后是二叉树的二叉链表表示法
*/
public static TreeNode makeBinaryTreeByArray(int[] array,int index){
if(index<array.length){
int value=array[index];
if(value!=0){
TreeNode t=new TreeNode(value);
array[index]=0;
t.left=makeBinaryTreeByArray(array,index*2);
t.right=makeBinaryTreeByArray(array,index*2+1);
return t;
}
}
return null;
}

/**
* 深度优先遍历,相当于先根遍历
* 采用非递归实现
* 需要辅助数据结构:栈
*/
public void depthOrderTraversal(){
if(root==null){
System.out.println("empty tree");
return;
}
ArrayDeque<TreeNode> stack=new ArrayDeque<TreeNode>();
stack.push(root);
while(stack.isEmpty()==false){
TreeNode node=stack.pop();
System.out.print(node.value+"    ");
if(node.right!=null){
stack.push(node.right);
}
if(node.left!=null){
stack.push(node.left);
}
}
System.out.print("\n");
}

/**
* 广度优先遍历
* 采用非递归实现
* 需要辅助数据结构:队列
*/
public void levelOrderTraversal(){
if(root==null){
System.out.println("empty tree");
return;
}
ArrayDeque<TreeNode> queue=new ArrayDeque<TreeNode>();
queue.add(root);
while(queue.isEmpty()==false){
TreeNode node=queue.remove();
System.out.print(node.value+"    ");
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
System.out.print("\n");
}

/**
*                  13
*                 /  \
*               65    5
*              /  \    \
*             97  25   37
*            /    /\   /
*           22   4 28 32
*/
public static void main(String[] args) {
int[] arr={0,13,65,5,97,25,0,37,22,0,4,28,0,0,32,0};
BinaryTree tree=new BinaryTree(arr);
tree.depthOrderTraversal();
tree.levelOrderTraversal();
}
}


转载自:
http://blog.csdn.net/andyelvis/article/details/1728378 http://driftcloudy.iteye.com/blog/782873
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: