Traversal翻譯成中文就是遍歷的意思,如果要遍歷tree的每個節點的話,會有兩種方式,Breadth-First Tree Traversal和Depth-First Tree Traversal。
Traversal 翻譯成中文就是遍歷的意思,如果要遍歷 tree 的每個節點的話,會有兩種方式,Breadth-First Tree Traversal 和 Depth-First Tree Traversal。
Breadth-First Tree Traversal
Breadth-First Tree Traversal 也被稱作 Level Order Tree Traversal,利用廣度優先搜尋(Breadth-First Search,BFS)的方式來遍歷每個節點,概念非常容易理解,就是將每一層的節點由左至右依序取出。
甚麼是廣度優先搜尋?
從某個節點出發,接下來走訪相鄰節點,同一層的都走訪完了就往下一層
假設我們現在有顆 Binary Tree 如下圖
用廣度優先搜尋的方式走訪的步驟為:
第 1 層 取出 10
第 2 層 取出 8, 11
第 3 層 取出 5, 9 ,15
第 4 層 取出 2, 13, 19
最後取得陣列 [10, 8, 11, 5, 9, 15, 2, 13, 19]
用 js 實作 Breadth-First Tree Traversal:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
bftt(node) { if (node === null) return; this.queue.push(node); for (let i = 0; i < this.queue.length; i++) { let currentNode = this.queue[i]; if (currentNode === null) continue; if (currentNode.left !== null) { this.queue.push(currentNode.left); } if (currentNode.right !== null) { this.queue.push(currentNode.right); } } }
tree.bftt(tree.root);
Depth-First Tree Traversal
採用的是深度優先搜尋(Depth-First-Search,DFS)的方式來遍歷節點,Depth-First Tree Traversal 又分為三種,這三種非常類似,但遍歷的順序不同。
preorder — 前序
inorder — 中序
postorder — 後序
深度優先搜尋
深度優先搜尋演算法(英語:Depth-First-Search,DFS)是一種用於遍歷或搜尋樹或圖的演算法。這個演算法會儘可能深的搜尋樹的分支。當節點 v 的所在邊都己被探尋過,搜尋將回溯到發現節點 v 的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中一個作為源節點並重複以上過程,整個行程反覆進行直到所有節點都被存取為止。這種演算法不會根據圖的結構等資訊調整執行策略(引用自 wikipedia)