讓我們用下面的HTML代碼爲例:
<div class="a">
<div class="aa">
<span class="aaa">
</span>
<span class="aab">
</span>
</div
<div class="ab">
<span class="aba">
</span>
<span class="abb">
</span>
</div
</div>
DFS會經常去首先是下一級節點,並且只有當沒有更多未遍歷的子節點時,它纔會進入當前級別的下一個節點。
一個DFS會遍歷例子的節點按以下順序:
a, aa, aaa, aab, ab, aba, abb
BFS總是遍歷所有在當前水平第一後,纔將它去節點的下一級節點。
一個BFS會遍歷例子的節點按以下順序:
a, aa, ab, aaa, aab, aba, abb
沒有一個明確的答案,其中的一個,你應該使用。通常取決於你的需求。
實現細節:
對於DFS人們經常使用stack。
僞代碼:
stack my_stack;
list visited_nodes;
my_stack.push(starting_node);
while my_stack.length > 0
current_node = my_stack.pop();
if current_node == null
continue;
if current_node in visited_nodes
continue;
visited_nodes.add(current_node);
// visit node, get the class or whatever you need
foreach child in current_node.children
my_stack.push(child);
該代碼會去,直到有棧中的任何節點。在每一步中,我們都得到堆棧中的頂層節點,如果它不是空的,並且我們之前沒有訪問它,那麼我們將訪問它並將其所有子節點添加到堆棧中。
Queue通常用於BFS。
僞代碼:
queue my_queue;
list visited_nodes;
my_queue.enqueue(starting_node);
while my_queue.length > 0
current_node = my_queue.dequeue();
if current_node == null
continue;
if current_node in visited_nodes
continue;
visited_nodes.add(current_node);
// visit node, get the class or whatever you need
foreach child in current_node.children
my_queue.enqueue(child);
此代碼將去,直到出現在隊列中的任何節點。在每一步中,我們都會得到隊列中的第一個節點,如果它不是null,並且我們之前沒有訪問過它,那麼我們將它的所有子節點添加到隊列中。
請注意,兩種算法的主要區別在於我們使用的數據類型。
您是否嘗試瞭解來自http://www.w3schools.com/js/js_htmldom_navigation.asp的dom遍歷 –
您可能沒有在SO上找到任何內容,因爲這樣的問題通常是關閉的 –
@AmitKumar-請勿參考w3schools,它充滿了錯誤。最好參考MDN。 – RobG