最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單談?wù)凧ava遍歷樹深度優(yōu)先和廣度優(yōu)先的操作方式

 更新時(shí)間:2023年03月24日 08:31:02   作者:kangbin825  
這篇文章主要介紹了簡(jiǎn)單談?wù)凧ava遍歷樹深度優(yōu)先和廣度優(yōu)先的操作方式的相關(guān)資料,需要的朋友可以參考下

在編程生活中,我們總會(huì)遇見樹性結(jié)構(gòu),這幾天剛好需要對(duì)樹形結(jié)構(gòu)操作,就記錄下自己的操作方式以及過(guò)程?,F(xiàn)在假設(shè)有一顆這樣樹,(是不是二叉樹都沒(méi)關(guān)系,原理都是一樣的)

1、深度優(yōu)先

英文縮寫為DFS即Depth First Search.其過(guò)程簡(jiǎn)要來(lái)說(shuō)是對(duì)每一個(gè)可能的分支路徑深入到不能再深入為止,而且每個(gè)節(jié)點(diǎn)只能訪問(wèn)一次。對(duì)于上面的例子來(lái)說(shuō)深度優(yōu)先遍歷的結(jié)果就是:A,B,D,E,I,C,F,G,H.(假設(shè)先走子節(jié)點(diǎn)的的左側(cè))。

深度優(yōu)先遍歷各個(gè)節(jié)點(diǎn),需要使用到棧(Stack)這種數(shù)據(jù)結(jié)構(gòu)。stack的特點(diǎn)是是先進(jìn)后出。整個(gè)遍歷過(guò)程如下:

首先將A節(jié)點(diǎn)壓入棧中,stack(A);

將A節(jié)點(diǎn)彈出,同時(shí)將A的子節(jié)點(diǎn)C,B壓入堆中,此時(shí)B在堆的頂部,stack(B,C);

將B節(jié)點(diǎn)彈出,同時(shí)將B的子節(jié)點(diǎn)E,D壓入堆中,此時(shí)D在堆的頂部,stack(D,E,C);

將D節(jié)點(diǎn)彈出,沒(méi)有子節(jié)點(diǎn)壓入,此時(shí)E在堆的頂部,stack(E,C);

將E節(jié)點(diǎn)彈出,同時(shí)將E的子節(jié)點(diǎn)I壓入,stack(I,C);

...依次往下,最終遍歷完成,Java代碼大概如下:

public void depthFirst() {

    Stack<Map<String, Object>> nodeStack = new Stack<Map<String, Object>>();

    Map<String, Object> node = new HashMap<String, Object>();

    nodeStack.add(node);

    while (!nodeStack.isEmpty()) {

        node = nodeStack.pop();

        System.out.println(node);

        //獲得節(jié)點(diǎn)的子節(jié)點(diǎn),對(duì)于二叉樹就是獲得節(jié)點(diǎn)的左子結(jié)點(diǎn)和右子節(jié)點(diǎn)

        List<Map<String, Object>> children = getChildren(node);

        if (children != null && !children.isEmpty()) {

            for (Map child : children) {

                nodeStack.push(child);

            }

        }

    }

}

//節(jié)點(diǎn)使用Map存放

2、廣度優(yōu)先

        英文縮寫為BFS即Breadth First Search。其過(guò)程檢驗(yàn)來(lái)說(shuō)是對(duì)每一層節(jié)點(diǎn)依次訪問(wèn),訪問(wèn)完一層進(jìn)入下一層,而且每個(gè)節(jié)點(diǎn)只能訪問(wèn)一次。對(duì)于上面的例子來(lái)說(shuō),廣度優(yōu)先遍歷的 結(jié)果是:A,B,C,D,E,F,G,H,I(假設(shè)每層節(jié)點(diǎn)從左到右訪問(wèn))。

       廣度優(yōu)先遍歷各個(gè)節(jié)點(diǎn),需要使用到隊(duì)列(Queue)這種數(shù)據(jù)結(jié)構(gòu),queue的特點(diǎn)是先進(jìn)先出,其實(shí)也可以使用雙端隊(duì)列,區(qū)別就是雙端隊(duì)列首位都可以插入和彈出節(jié)點(diǎn)。整個(gè)遍歷過(guò)程如下:

      首先將A節(jié)點(diǎn)插入隊(duì)列中,queue(A);

      將A節(jié)點(diǎn)彈出,同時(shí)將A的子節(jié)點(diǎn)B,C插入隊(duì)列中,此時(shí)B在隊(duì)列首,C在隊(duì)列尾部,queue(B,C);

      將B節(jié)點(diǎn)彈出,同時(shí)將B的子節(jié)點(diǎn)D,E插入隊(duì)列中,此時(shí)C在隊(duì)列首,E在隊(duì)列尾部,queue(C,D,E);

      將C節(jié)點(diǎn)彈出,同時(shí)將C的子節(jié)點(diǎn)F,G,H插入隊(duì)列中,此時(shí)D在隊(duì)列首,H在隊(duì)列尾部,queue(D,E,F(xiàn),G,H);

      將D節(jié)點(diǎn)彈出,D沒(méi)有子節(jié)點(diǎn),此時(shí)E在隊(duì)列首,H在隊(duì)列尾部,queue(E,F(xiàn),G,H);

      ...依次往下,最終遍歷完成,Java代碼大概如下:

public void breadthFirst() {

    Deque<Map<String, Object>> nodeDeque = new ArrayDeque<Map<String, Object>>();

    Map<String, Object> node = new HashMap<String, Object>();

    nodeDeque.add(node);

    while (!nodeDeque.isEmpty()) {

        node = nodeDeque.peekFirst();

        System.out.println(node);

        //獲得節(jié)點(diǎn)的子節(jié)點(diǎn),對(duì)于二叉樹就是獲得節(jié)點(diǎn)的左子結(jié)點(diǎn)和右子節(jié)點(diǎn)

        List<Map<String, Object>> children = getChildren(node);

        if (children != null && !children.isEmpty()) {

            for (Map child : children) {

                nodeDeque.add(child);

            }

        }

    }

}

//這里使用的是雙端隊(duì)列,和使用queue是一樣的

到此這篇關(guān)于簡(jiǎn)單談?wù)凧ava遍歷樹深度優(yōu)先和廣度優(yōu)先的操作方式的文章就介紹到這了,更多相關(guān)Java遍歷樹的深度優(yōu)先和廣度優(yōu)先內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java文件拒絕訪問(wèn)問(wèn)題及解決

    Java文件拒絕訪問(wèn)問(wèn)題及解決

    這篇文章主要介紹了Java文件拒絕訪問(wèn)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java去掉數(shù)字字符串開頭的0三種方法(推薦)

    Java去掉數(shù)字字符串開頭的0三種方法(推薦)

    下面小編就為大家?guī)?lái)一篇Java去掉數(shù)字字符串開頭的0三種方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 淺談Java中類的實(shí)例化步驟

    淺談Java中類的實(shí)例化步驟

    今天小編就為大家分享一篇關(guān)于淺談Java中類的實(shí)例化步驟,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • 淺析Java常用API(Scanner,Random)匿名對(duì)象

    淺析Java常用API(Scanner,Random)匿名對(duì)象

    這篇文章主要介紹了Java常用API(Scanner,Random)匿名對(duì)象,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java字節(jié)碼ByteBuddy使用及原理解析下

    Java字節(jié)碼ByteBuddy使用及原理解析下

    這篇文章主要為大家介紹了Java字節(jié)碼ByteBuddy使用及原理解析下篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • jpa實(shí)現(xiàn)多對(duì)多的屬性時(shí)查詢的兩種方法

    jpa實(shí)現(xiàn)多對(duì)多的屬性時(shí)查詢的兩種方法

    這篇文章主要介紹了jpa實(shí)現(xiàn)多對(duì)多的屬性時(shí)查詢的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • mybatis中${}和#{}取值的區(qū)別分析

    mybatis中${}和#{}取值的區(qū)別分析

    mybatis中使用sqlMap進(jìn)行sql查詢時(shí),經(jīng)常需要?jiǎng)討B(tài)傳遞參數(shù),在動(dòng)態(tài)SQL解析階段, #{ } 和 ${ } 會(huì)有不同的表現(xiàn),這篇文章主要給大家介紹了關(guān)于mybatis中${}和#{}取值區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • SpringBoot2.x 集成 Thymeleaf的詳細(xì)教程

    SpringBoot2.x 集成 Thymeleaf的詳細(xì)教程

    本文主要對(duì)SpringBoot2.x集成Thymeleaf及其常用語(yǔ)法進(jìn)行簡(jiǎn)單總結(jié),其中SpringBoot使用的2.4.5版本。對(duì)SpringBoot2.x 集成 Thymeleaf知識(shí)感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Java運(yùn)算符從見過(guò)到掌握上

    Java運(yùn)算符從見過(guò)到掌握上

    計(jì)算機(jī)的最基本用途之一就是執(zhí)行數(shù)學(xué)運(yùn)算,作為一門計(jì)算機(jī)語(yǔ)言,Java也提供了一套豐富的運(yùn)算符來(lái)操縱變量,本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java Web項(xiàng)目創(chuàng)建并實(shí)現(xiàn)前后端交互

    Java Web項(xiàng)目創(chuàng)建并實(shí)現(xiàn)前后端交互

    本文主要介紹了Java Web項(xiàng)目創(chuàng)建并實(shí)現(xiàn)前后端交互,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論

龙游县| 平原县| 宁陕县| 巴马| 郓城县| 梁河县| 铜山县| 芒康县| 宜兴市| 宝鸡市| 贡山| 巴中市| 紫阳县| 陈巴尔虎旗| 静安区| 鹿邑县| 南丰县| 横峰县| 垫江县| 台南县| 沈阳市| 寿宁县| 赣州市| 铜梁县| 雷山县| 咸宁市| 三河市| 慈溪市| 乐清市| 宣武区| 琼海市| 丰镇市| 普兰县| 华亭县| 大悟县| 香河县| 留坝县| 红原县| 循化| 高州市| 陈巴尔虎旗|