广度搜索和深度搜索

广度搜索和深度搜索广度搜索和深度搜索最短路径问题我现在要从“双子峰”前往“金门大桥”,求最短的路径根据图建立树根据图建立二叉树模型packageDataStructure.FS;publicclassPlaceTree{//存储当前地址

广度搜索和深度搜索

最短路径问题

我现在要从“双子峰” 前往 “金门大桥” ,求最短的路径
广度搜索和深度搜索

根据图建立树

根据图建立二叉树模型

package DataStructure.FS;public class PlaceTree {    //存储当前地址    String place;    //左孩子节点    PlaceTree leftPlace;    //右孩子节点    PlaceTree rightPlace;    //无参构造方法    public PlaceTree() {    }    //带单独参构造方法    public PlaceTree(String p){        place = p;    }    //带全参的构造方法    public PlaceTree(PlaceTree left,PlaceTree right,String p){        //放置左孩子        leftPlace = left;        //放置右孩子        rightPlace = right;        //放置位置        place = p;    }}

实现二叉树

 public static void main(String[] args) {        PlaceTree szf = new PlaceTree("双子峰");        PlaceTree aqdd = new PlaceTree("阿奇大道");        PlaceTree syj = new PlaceTree("商业街");        PlaceTree llw = new PlaceTree("牛罗湾");        PlaceTree xyg = new PlaceTree("新宇港");        PlaceTree kklj = new PlaceTree("酷客老街");        PlaceTree jmdq = new PlaceTree("金门大桥");        //创建节点        szf.leftPlace = aqdd;        szf.rightPlace = syj;        aqdd.rightPlace = llw;        syj.leftPlace = xyg;        syj.rightPlace = kklj;        xyg.rightPlace = llw;        kklj.rightPlace = llw;        llw.rightPlace = jmdq;        //设置关系        System.out.println("广度优先遍历结果:");        new PlaceBFS().BroadFirstSearch(szf);        System.out.println("深度优先遍历结果:");        new PlaceBFS().DepthFirstSearch(szf);    }

实现 BFS 广度搜索

 public void BroadFirstSearch(PlaceTree nodeHead){        //如果节点为空,返回        if(nodeHead == null)            return;        //以队列的方式 (FIFO) 实现广度搜索        Queue<PlaceTree> myQueue = new LinkedList<>();        myQueue.add(nodeHead);        //将节点压入队列        while(! myQueue.isEmpty()){            PlaceTree node = myQueue.poll();                System.out.print(node.place + " ");                if (null != node.leftPlace) {                    myQueue.add(node.leftPlace);                    //有左孩子就压左孩子                }                if (null != node.rightPlace) {                    myQueue.add(node.rightPlace);                    //有右孩子就压有孩子                }                //呈现右孩子和右孩子都压入队列中的情况,这样说好恐怖。        }    }

实现 DFS 深度搜索

public void DepthFirstSearch(PlaceTree nodeHead){        if(nodeHead == null){            return;        }        //以堆栈 (LIFO) 实现深度搜索        Stack<PlaceTree> myStack = new Stack<>();        myStack.add(nodeHead);        while(! myStack.isEmpty()){            PlaceTree node = myStack.pop();            System.out.print(node.place+" ");            if(node.rightPlace != null){                myStack.push(node.rightPlace);            }            //如果右节点不为空就压入            if(node.leftPlace != null){                myStack.push(node.leftPlace);            }            //如果左节点不为空就压入        }        //左节点后压入,左节点后出    }

BFS 和 DFS 源代码

package DataStructure.FS;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;public class PlaceBFS {    public static void main(String[] args) {        PlaceTree szf = new PlaceTree("双子峰");        PlaceTree aqdd = new PlaceTree("阿奇大道");        PlaceTree syj = new PlaceTree("商业街");        PlaceTree llw = new PlaceTree("牛罗湾");        PlaceTree xyg = new PlaceTree("新宇港");        PlaceTree kklj = new PlaceTree("酷客老街");        PlaceTree jmdq = new PlaceTree("金门大桥");        //创建节点        szf.leftPlace = aqdd;        szf.rightPlace = syj;        aqdd.rightPlace = llw;        syj.leftPlace = xyg;        syj.rightPlace = kklj;        xyg.rightPlace = llw;        kklj.rightPlace = llw;        llw.rightPlace = jmdq;        //设置关系        System.out.println("广度优先遍历结果:");        new PlaceBFS().BroadFirstSearch(szf);        System.out.println();        System.out.println("深度优先遍历结果:");        new PlaceBFS().DepthFirstSearch(szf);    }    public void BroadFirstSearch(PlaceTree nodeH 黑龙江红色教育培训 www.sxganxun.cn ead){        //如果节点为空,返回        if(nodeHead == null)            return;        //以队列的方式 (FIFO) 实现广度搜索        Queue<PlaceTree> myQueue = new LinkedList<>();        myQueue.add(nodeHead);        //将节点压入队列        while(! myQueue.isEmpty()){            PlaceTree node = myQueue.poll();                System.out.print(node.place + " ");                if (null != node.leftPlace) {                    myQueue.add(node.leftPlace);                    //有左孩子就压左孩子                }                if (null != node.rightPlace) {                    myQueue.add(node.rightPlace);                    //有右孩子就压有孩子                }                //呈现左孩子和右孩子都压入队列中的情况,这样说好恐怖。        }    }    public void DepthFirstSearch(PlaceTree nodeHead){        if(nodeHead == null){            return;        }        //以堆栈 (LIFO) 实现深度搜索        Stack<PlaceTree> myStack = new Stack<>();        myStack.add(nodeHead);        while(! myStack.isEmpty()){            PlaceTree node = myStack.pop();            System.out.print(node.place+" ");            if(node.rightPlace != null){                myStack.push(node.rightPlace);            }            //如果右节点不为空就压入            if(node.leftPlace != null){                myStack.push(node.leftPlace);            }            //如果左节点不为空就压入        }        //左节点后压入,左节点后出    }}

结果

广度优先遍历结果:
双子峰 阿奇大道 商业街 牛罗湾 新宇港 酷客老街 金门大桥 牛罗湾 牛罗湾 金门大桥 金门大桥
深度优先遍历结果:
双子峰 阿奇大道 牛罗湾 金门大桥 商业街 新宇港 牛罗湾 金门大桥 酷客老街 牛罗湾 金门大桥

BFS 和 DFS 搜索方式

为什么深度优先搜索的结果更好,下图分析:

BFS的搜索步骤图

广度搜索和深度搜索

BFS 有点像横向的分层。

“起点”、“商业街”和“阿奇大道”为一层,

“酷客老街”、“新宇港”和“牛罗湾”为第二层,

“牛罗湾”和“终点”为第三次层,“终点”为第四层。

DFS的搜搜步骤图

广度搜索和深度搜索

DFS 有点向竖向的分列。

“起点”、“阿奇大道”、“牛罗湾”、“终点” 为一列,得到最短解。

“起点”、“商业街”、“新宇港”、“牛罗湾”、“终点”为一列,得到第二种解。

“商业街”、“酷客老街”、“牛罗湾”、“终点”为一列,得到第三种解。

今天的文章广度搜索和深度搜索分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/68702.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注