日常coding中,我個人用的比較多的是深度優先遍歷,因為這種比較好理解,而且程式碼量少,總是遞迴一把梭。
而今天探究了下如何廣度優先遍歷,發現其思路上是截然不同的,它比較巧妙的利用到了佇列機制。
準備工作
首先我們先建立一個html:
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<div></div>
<p></p>
</body>
</html>
複製程式碼
目標
按廣度優先順序,輸出標籤名。
圖解
首先我用二叉樹圖來表示了當前結構:
這時候你應該能通過此圖片,直接說出了答案:
// html、head、body、meta、title、div、p
// 從上往下,從左往右,很簡單嘛...
複製程式碼
我們該如何通過佇列來獲得這樣的順序呢?
程式碼解讀
我們先看實現程式碼:
function wideTraversal(){
let html = document.documentElement; // 獲取html標籤
let queue = [html]; //佇列裡只有一個html,準備開始
while(queue.length > 0){ // 開始...
// 當前遍歷元素出列,並獲得其子元素
let { children, tagName } = current = queue.shift();
// Todo
console.log(tagName.toLocaleLowerCase());
for(let i = 0; i < children.length; i++){ //將子元素新增到queue末端
queue.push(children[i]);
}
}
}
複製程式碼
其中queue為佇列,while(queue.length > 0) 和 queue.shift()
控制了遍歷次數。這裡我們先觀察queue在while中的變化:
每次迴圈,子元素都在父元素及叔元素的後端,從而實現了上述用二叉圖解讀答案的方式。
總結
這篇文章只是學習筆記,如有不當請指正。