日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

多级树的深度优先遍历与广度优先遍历(Java实现)

發(fā)布時間:2025/7/14 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多级树的深度优先遍历与广度优先遍历(Java实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 多級樹的深度優(yōu)先遍歷與廣度優(yōu)先遍歷(Java實現(xiàn))
    • 節(jié)點模型
    • 深度優(yōu)先遍歷
    • 廣度優(yōu)先遍歷

多級樹的深度優(yōu)先遍歷與廣度優(yōu)先遍歷(Java實現(xiàn))

深度優(yōu)先遍歷與廣度優(yōu)先遍歷其實是屬于圖算法的一種,多級樹可以看做是一種特殊的圖,所以多級數(shù)的深/廣遍歷直接套用圖結(jié)構(gòu)的遍歷方法即可。

工程中后端通常會用多級樹來存儲頁面表單的各級聯(lián)動類目,本文提供了深度遍歷與廣度遍歷的示例,在使用時只要根據(jù)你的業(yè)務(wù)需求稍加改動即可。

我們知道,遍歷有遞歸,非遞歸兩種方式。在工程項目上,一般是禁用遞歸方式的,因為遞歸非常容易使得系統(tǒng)爆棧。同時,JVM也限制了最大遞歸數(shù)量,在你的樹結(jié)構(gòu)非常深的時候很容易出現(xiàn)StackOverflowError異常,所以最好采用非遞歸的方式。

節(jié)點模型

public class Node {//值public int value;//所有的子節(jié)點public ArrayList<Node> nexts;public Node(int value) {this.value = value;} }

深度優(yōu)先遍歷

深度優(yōu)先搜索英文縮寫為DFS即Depth First Search.其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,而且每個節(jié)點只能訪問一次。多級樹可以看做一個特殊的圖結(jié)構(gòu),總的來說遍歷的方法還是不變的,都是利用棧和Set來進行操作。

主要步驟:

  • 準備一個棧結(jié)構(gòu)和一個Set結(jié)構(gòu)的集合,棧用來記錄還有孩子沒有被遍歷到的節(jié)點,Set用來記錄遍歷的歷史記錄
  • 將首節(jié)點加入到棧和set中
  • 彈棧拿到首節(jié)點
  • 從首節(jié)點開始深度遍歷,下面示例代碼配合注解近進行理解。
  • public static void dfs(Node node) {if (node == null) {return;}Stack<Node> stack = new Stack<>();HashSet<Node> set = new HashSet<>();stack.add(node);set.add(node);System.out.println(node.value);while (!stack.isEmpty()) {//彈棧獲得一個節(jié)點Node cur = stack.pop();//查看這個節(jié)點的所有孩子for (Node next : cur.nexts) {//如果有孩子是之前沒有遍歷到的,說明這個節(jié)點沒有深度遍歷完if (!set.contains(next)) {//此節(jié)點與其孩子加入棧與Set中stack.push(cur);stack.push(next);set.add(next);System.out.println(next.value);break;}}} }

    廣度優(yōu)先遍歷

    寬度優(yōu)先搜索算法(又稱廣度優(yōu)先搜索)是最簡便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型。對于多級數(shù)來說,就是先遍歷該節(jié)點的所有孩子,然后在遍歷孩子節(jié)點的所有孩子,先遍歷一層再遍歷下一次層。

    主要思路就是利用隊列來將下一層的所有節(jié)點記錄下來,然后順序遍歷就可以了。

    public static void bfs(Node node) {if (node == null) {return;}Queue<Node> queue = new LinkedList<>();//用來注冊已加入隊列的節(jié)點——>防止重復(fù)添加節(jié)點HashSet<Node> set = new HashSet<>();queue.add(node);set.add(node);while (!queue.isEmpty()) {Node cur = queue.poll();System.out.println(cur.value);//將節(jié)點的所有下游節(jié)點加入到隊列for (Node next : cur.nexts) {if (!set.contains(next)) {set.add(next);queue.add(next);}}} }

    轉(zhuǎn)載于:https://www.cnblogs.com/keeya/p/11487465.html

    總結(jié)

    以上是生活随笔為你收集整理的多级树的深度优先遍历与广度优先遍历(Java实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。