js實現深度優先遍歷和廣度優先遍歷

深度優先遍歷和廣度優先遍歷

什麼是深度優先和廣度優先

其實簡單來講 深度優先就是自上而下的遍歷搜索 廣度優先則是逐層遍歷, 以下圖所示javascript

1.深度優先java

image.png

 

2.廣度優先web

image.png

 

二者的區別

對於算法來講 無非就是時間換空間 空間換時間算法

  1. 深度優先不須要記住全部的節點, 因此佔用空間小, 而廣度優先須要先記錄全部的節點佔用空間大
  2. 深度優先有回溯的操做(沒有路走了須要回頭)因此相對而言時間會長一點

深度優先採用的是堆棧的形式, 即先進後出
廣度優先則採用的是隊列的形式, 即先進先出ui

具體代碼

const data = [ { name: 'a', children: [ { name: 'b', children: [{ name: 'e' }] }, { name: 'c', children: [{ name: 'f' }] }, { name: 'd', children: [{ name: 'g' }] }, ], }, { name: 'a2', children: [ { name: 'b2', children: [{ name: 'e2' }] }, { name: 'c2', children: [{ name: 'f2' }] }, { name: 'd2', children: [{ name: 'g2' }] }, ], } ] // 深度遍歷, 使用遞歸 function getName(data) { const result = []; data.forEach(item => { const map = data => { result.push(data.name); data.children && data.children.forEach(child => map(child)); } map(item); }) return result.join(','); } // 廣度遍歷, 建立一個執行隊列, 當隊列爲空的時候則結束 function getName2(data) { let result = []; let queue = data; while (queue.length > 0) { [...queue].forEach(child => { queue.shift(); result.push(child.name); child.children && (queue.push(...child.children)); }); } return result.join(','); } console.log(getName(data)) console.log(getName2(data))
相關文章
相關標籤/搜索