多级树的深度优先遍历与广度优先遍历(Java实现)
目錄
- 多級樹的深度優(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來進(jìn)行操作。
主要步驟:
廣度優(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海信信号机与铭达倒计时通信对接配置
- 下一篇: 新设备关联Gitlab