1、前置條件
我們提前構建一棵樹,類型為 Tree
,其節點類型為 Note
。這里我們不進行過多的實現,簡單描述下 Note
的結構:
class Node{
constructor(data){
this.data = data;
this.children = []; // 存放所以子節點,如果是二叉樹,可以分為兩個屬性,left和right分別存儲左右子節點
}
}
class Tree{
constructor(){
this.root = new Node('root'); // 樹結構,標識出自己的根節點
}
}
2、廣度優先遍歷
廣度優先遍歷,就是按層來遍歷樹結構,例如:
1
2 3
4 5 6
// 遍歷出來的結果:123456
實現思路:
-
- 首先創建一個隊列,然后將樹的根節點,放入隊列,作為隊列第一個元素
-
- 然后開始遍歷隊列,如果遍歷的元素,有子節點,則將所有子節點,追加進隊列末尾
-
- 最后的隊列就是廣度優先遍歷的結果
使用JavaScript來實現:
- 最后的隊列就是廣度優先遍歷的結果
function bsf(tree){
let quen = []; // 用來遍歷的數組
// let result = []; // 遍歷的結果
quen.push(tree.root);
// 從隊列取,然后再追加
for(let i = 0;i<=quen.length-1;i++){
let k = quen[i];
if(k.children.length){
quen = quen.concat(k.children);
}
}
return quen;
}
3、深度優先搜索
先遍歷完一個末尾節點,再遍歷第二個末尾節點,例如:
1
2 3
4 5 6
// 遍歷出來的結果:124536
深度優先,最簡單的方法就是遞歸遍歷,但是不適合實際中使用:
使用棧來實現深度優先遍歷:
-
- 節點需要增加一些屬性,來標識我們的計算狀態,isDone是否已經檢測過,isOver是否還有子節點未檢測
-
- 建立一個棧,把樹的根節點放進去。在准備一個數組,用來顯示我們檢測的路徑
-
- 取出棧中最上面的節點,檢測(檢測完放進路徑數組),然后將某個未檢測的子節點,放入棧
-
- 重復3步驟,如果該節點,沒有未檢測的子節點,且自身已檢測完畢,則將其上級節點,再次添加到 棧 中
-
- 重復3步驟